17 映射
映射将键映射到值。
映射的零值为nil。nil映射既没有键,也不能添加键。
make函数会返回给定类型的映射,并将其初始化备用。
package main
import "fmt"
func main() {
var m map[string]int
m = make(map[string]int)
m["kk"] = 12
m["gg"] = 11
fmt.Println(m["kk"])
fmt.Println(m)
fmt.Printf("%T\n", m)
}
18 映射的文法
映射的文法与结构体类似,不过必须有键名。
package main
import "fmt"
type vvv struct {
lll, ll float64
}
var m = map[string]vvv{
"www":vvv{
12.3,13.4,
},
"ppp":vvv{
22.5, 33.7,
},
}
func main() {
fmt.Println(m)
}
若顶级类型只是一个类型名,可以在文法元素中省略。
19 修改映射
在映射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]
package main
import "fmt"
func main() {
m := make(map[string]int)
m["aaa"] = 42
fmt.Println("The value:", m["aaa"])
m["aaa"] = 48
fmt.Println("The value:", m["aaa"])
delete(m, "aaa")
fmt.Println("The value:", m["aaa"])
v, ok := m["aaa"]
fmt.Println("The value:", v, "Present?", ok)
}
20 函数值
函数也是值,可以如同其他值一样传递。
函数值可以用作函数的参数或返回值。
package main
import "fmt"
func kkk(i func()){
fmt.Println("kkkk")
i()
}
func main() {
fff := func() { fmt.Println("fff") }
kkk(fff)
}
21 函数的闭包
Go函数可以为闭包。闭包是一个函数值,它引用了函数体之外的变量。该函数可以访问并赋予其引用的变量的值,即,该函数被“绑定”在了这些变量上。
package main
import "fmt"
func main() {
count := 0
ff := func() {
fmt.Println(count)
}
for i := 0; i < 10; i ++ {
count++
ff()
}
}