Go语言学习4:数组、切片、map映射

数组

数组是同一类型元素的集合。举例:

package main

import "fmt"

func main() {
	var a [2]string
	a[0] = "Hello"
	a[1] = "World"
	fmt.Println(a)

	primes := [6]int{2, 3, 5, 7, 11, 13}
	// 也可自动根据元素个数计算数组长度
	// primes := [...]int{1, 2, 3}
	fmt.Println(primes)
}

数组的大小是类型的一部分。因此 [5]int 和 [25]int 是不同类型。举例:

package main

func main() {
    a := [3]int{5, 78, 8}
    var b [5]int
    b = a //会报错!
}

Go 中的数组是值类型而不是引用类型。这意味着当数组赋值给一个新的变量时,该变量会得到一个原始数组的一个副本。如果对新变量进行更改,则不会影响原始数组。
同样,当数组作为参数传递给函数时,它们是按值传递,而原始数组保持不变。所以,把第一个大数组传递给函数会消耗很多内存。有两种方法可以避免这种现象:一是传递数组的指针,二是使用数组的切片(常用)。

切片

数组具有固定长度的限制,在 Go 中,切片比传统数组更常见,它不需要提前声明大小。切片本身不拥有任何数据,它们只是对现有数组的引用(它本身就是一个指针),总是指向一个底层array,所以它们不需要使用额外的内存。由于切片是引用类型,所以当引用改变其中元素的值时,其它所有的引用都会改变该值。

package main

import (
    "fmt"
)

func main() {
    a := [5]int{76, 77, 78, 79, 80}
    var b []int = a[1:4] // creates a slice from a[1] to a[3]
    fmt.Println(b)
}

对于数组var a [10]int来说,以下切片是等价的:

a[0:10]
a[:10]
a[0:]
a[:]

切片的长度和容量

切片的长度len()就是它所包含的元素个数。
切片的容量cap()是从它当前的第一个元素开始数,到其底层数组元素末尾的个数。如:

var a [5]int = {1,2,3,4,5}
b := a[0:2]
c := a[2:5]
len(b)2cap(b)5
len(c)3cap(c)3

切片的零值是 nilnil 切片的长度和容量为 0 且没有底层数组。

make()创建切片

当相关数组还没有定义时,我们可以使用 make() 函数来创建一个切片,同时创建好相关数组。

package main

import (
    "fmt"
)

func main() {
    i := make([]int, 5, 5)
    // i := []int{}
    fmt.Println(i)
}

数组的长度是固定的,它的长度不能增加。 切片是动态的,使用 append(s []T,x ... T) 可以将新元素追加到切片上,返回一个切片类型。

当新的元素被添加到切片时,会创建一个新的数组。现有数组的元素被复制到这个新数组中,并返回这个新数组的新切片引用。现在新切片的容量是旧切片的两倍。

map

map映射将键映射到值。声明语法:var map1 map[keyType]ValueType。未初始化的 map 的值是 nil,即零值 ,nil 映射既没有键,也不能添加键,此时必须使用make 函数进行初始化,或者在声明的同时就初始化,如下:

personSalary := map[string]int {
    "steve": 12000,
    "jamie": 15000,
}

map的一些操作:

package main

import "fmt"

func main() {
	m := make(map[string]int)
	// m := map[string][int]{}

	m["Answer"] = 42
	fmt.Println("The value:", m["Answer"])

	m["Answer"] = 48
	fmt.Println("The value:", m["Answer"])

	delete(m, "Answer")
	fmt.Println("The value:", m["Answer"])

	v, ok := m["Answer"] //若Key在m中,ok为true
	fmt.Println("The value:", v, "Present?", ok)
}

map的遍历:

//使用 for range 遍历 map 时,不保证获取的元素顺序每次都相同。
for key, value := range map1 {
}

和 切片 类似,map 也是引用类型。当 map 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。


学习资料:https://studygolang.com/subject/2

你可能感兴趣的:(Go)