Go语言入门指南5|青训营

73 阅读3分钟

这是 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