数组
数组是同一类型元素的集合。举例:
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)为2,cap(b)为5
len(c)为3,cap(c)为3
切片的零值是 nil
。nil
切片的长度和容量为 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
被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。