携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
映射
映射将键映射到值。映射的零值nil。nil映射没有键,也不能添加键。make函数会返回给定类型的映射,并将其初始化备用。
例子:
package main
import "fmt"
type Vertex7 struct {
Lat, Long float64
}
var m map[string]Vertex7
func main() {
m = make(map[string]Vertex7)
m["Bell Labs"] = Vertex7{40.6, -74.3}
fmt.Println(m["Bell Labs"])
}
映射的文法
映射的文法与结构体类似,不过必须有键名。
例子:
package main
import "fmt"
type Vertex8 struct {
Lat, Long float64
}
var m1 = map[string]Vertex8{
"Bell Labs": {40.6, -74.3},
"Google": {37.2, -122.4},
}
func main() {
fmt.Println(m1)
}
修改映射
在映射m中插入或修改元素:
m[key] = elem
获取元素:
elem = m[key]
删除元素:
delete(m,key)
通过双赋值检测某个键是否存在:
elem,ok = m[key]
如果key不存在就返回映射元素类型的零值。
例子:
package main
import "fmt"
func main() {
m := make(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"]
fmt.Println("The value:", v, "Present?", ok)
}
函数值
函数也是值。它们可以像其它值一样传递。函数值可以用作函数的参数或返回值。
package main
import (
"fmt"
"math"
)
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
func main() {
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(5, 12))
fmt.Println(compute(hypot))
fmt.Println(compute(math.Pow))
}
函数闭包
Go函数可以是一个闭包。闭包是一个函数值,它引用了其函数体之外的变量。该函数可以访问并赋予其引用的变量的值,换句话说,该函数被这些变量“绑定”在一起。
例如,下面的addr返回一个闭包,每个闭包都被绑定在其各自的sum变量上。
package main
import "fmt"
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
pos, neg := adder(), adder()
for i := 0; i < 10; i++ {
fmt.Println(pos(i), neg(-2*i))
}
}