这是 Go 语言学习记录系列的笔记5,快来跟我一起学习Go 的基础语法吧 Go神! 启动!
切片的切片
切片可包含任何类型,甚至包括其它的切片。
向切片追加元素
为切片追加新的元素是种常用的操作,为此 Go 提供了内建的 append 函数
func append(s []T, vs ...T) []T
append 的第一个参数 s 是一个元素类型为 T 的切片,其余类型为 T 的值将会追加到该切片的末尾。
append 的结果是一个包含原切片所有元素加上新添加元素的切片。
当 s 的底层数组太小,不足以容纳所有给定的值时,它就会分配一个更大的数组。返回的切片会指向这个新分配的数组
Range
for 循环的 range 形式可遍历切片或映射。
当使用 for 循环遍历切片时,每次迭代都会返回两个值。第一个值为当前元素的下标,第二个值为该下标所对应元素的一份副本。
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
可以将下标或值赋予 _ 来忽略它。
for i, _ := range pow
for _, value := range pow
若只需要索引,忽略第二个变量即可。
for i := range pow
映射 map
映射将键映射到值。
map[string]Vertex
映射的零值为 nil 。nil 映射既没有键,也不能添加键。
make 函数会返回给定类型的映射,并将其初始化备用
m = make(map[string]Vertex)
m["Bell Labs"] = Vertex{
40.68433, -74.39967,
}
映射的文法与结构体相似,不过必须有键名。若顶级类型只是一个类型名,你可以在文法的元素中省略它。
修改映射
在映射 m 中插入或修改元素:
m[key] = elem
获取元素:
elem = m[key]
删除元素:
delete(m, key)
通过双赋值检测某个键是否存在:
elem, ok = m[key]
若 key 在 m 中,ok 为 true ;否则,ok 为 false。
若 key 不在映射中,那么 elem 是该映射元素类型的零值。
同样的,当从映射中读取某个不存在的键时,结果是映射的元素类型的零值。
注 :若 elem 或 ok 还未声明,你可以使用短变量声明:
elem, ok := m[key]
函数值
函数也是值。它们可以像其它值一样传递。
函数值可以用作函数的参数或返回值。
函数的闭包
闭包是指一个函数内部引用了外部函数的变量,并且可以访问和操作这些变量。在 Go 语言中,可以通过使用匿名函数和函数的嵌套来定义闭包。
package main
import "fmt"
func main() {
add := closure(10)
fmt.Println(add(5)) // 输出 15
fmt.Println(add(10)) // 输出 25
}
func closure(x int) func(int) int {
return func(y int) int {
return x + y
}
}
在上面的代码中,closure 函数返回一个匿名函数。该匿名函数可以访问和操作 closure 函数中定义的变量 x,并且每次调用匿名函数都会返回 x 与传入的参数相加的结果。
输出结果为:
15
25