本文共 2005 字,大约阅读时间需要 6 分钟。
闭包(Closure)是 Go语言 中一个核心概念,它描述了一个函数与其相关的引用环境(Environment)结合而成的实体。闭包在函数式编程中是一个非常重要的概念,因为它允许函数在被定义时携带其上下文信息。
以以下代码为例:
package mainimport ( "fmt")func main() { var f = Adder() fmt.Print(f(1), "-") fmt.Print(f(20), "-") fmt.Print(f(300))}func Adder() func(int) int { var x int return func(delta int) int { x += delta return x }} 在这个例子中,Adder 函数返回一个闭包。这个闭包记住了在 Adder 函数中的变量 x。当我们调用 f(1)、f(20) 和 f(300) 时,每个调用都会修改同一个 x,从而导致累积的结果。
数组(Array)是 Go语言 中的一种基本数据结构,它是同一种数据类型的固定长度的序列。以下是关于数组的关键点:
定义: 数组的定义方式是 var a [len] type,其中 len 是数组的长度。例如:
var a [5] int
一旦数组被定义,其长度就无法改变。
长度: 数组的长度是其类型的一部分,因此 var a [5] int 和 var a [10] int 是不同的类型。
访问: 数组可以通过下标(从 0 开始)进行访问,最后一个元素的下标是 len - 1。访问越界会触发 panic 错误。
副本: 数组是值类型,修改副本的值不会影响原数组。
操作: 以下是通过函数 modify 修改数组的示例:
package mainimport ( "fmt")func modify(arr *[5]int) { arr[0] = 100 arr[1] = 65}func main() { var a [5] int modify(&a) for i := 0; i < len(a); i++ { fmt.Println(a[i]) }} 切片(Slice)是数组的一个引用,因此它是引用类型。以下是关于切片的关键点:
可变性: 切片的长度可以改变,因此它是一个可变的数组。
遍历: 切片可以通过 len() 函数获取长度,遍历方式与数组相同。
容量: 切片的容量可以通过 cap 函数获取,表示切片最大的容量。满足 0 <= len(slice) <= cap。
定义: 切片的定义方式是 var slice []type。例如:
var str []string
初始化: 切片可以通过数组的子序列初始化。例如:
slice := arr[start:end]
其中 end 是不包含在切片中的索引。
创建切片: Go语言 提供了 make() 函数来创建切片。例如:
slice := make([]int, 5)slice := make([]int, 5, 10)
第三个参数是容量(可选)。
修改切片: 可以使用 append() 函数动态增加切片的元素。例如:
slice := make([]int, 0)slice = append(slice, 10)
遍历: 遍历切片的方式是通过 for index, val := range slice 来实现的。
字符串与切片: 字符串在底层是一个 byte 数组,因此可以进行切片操作。例如:
str := "hello world"s1 := str[0:4]s2 := str[3:]
映射(Map)是 Go语言 中另一种基本数据结构,它存储的是 key-value 对。以下是关于映射的关键点:
声明: 映射的声明方式是 var map map[keytype] valuetype,但需要使用 make() 初始化。例如:
var a map[string]string = make(map[string]string, 10)
操作:
a["key"] = valuevalue, ok := a["key"]for k, v := range adelete(a, "key")引用类型: 映射是引用类型,因此修改映射的内容会影响原映射。
多维映射: 可以创建嵌套映射。例如:
type Point struct { X int Y int}var points map[Point]int 排序: 要对映射进行排序,可以先获取所有键,排序后再遍历。
转载地址:http://fnqfk.baihongyu.com/