1、映射
1.1 概念
go的映射在java中被叫做集合
type Vertex struct { Lat, Long float64 }
var m map[string]Vertex
上面是go的映射m,如果用java代替的话,Vertex就是实体类,这样用java8可以写成
Map m = new HashMap<String,Vertex>()
所以go的映射就是java中的map集合
映射将键映射到值。映射的零值为 nil
。nil
映射既没有键,也不能添加键。make
函数会返回给定类型的映射,并将其初始化备用
1.2 映射创建
创建映射的时候,可以这样赋值
var m = map[string]Vertex{ "Bell Labs": Vertex{ 40.68433, -74.39967, }, "Google": Vertex{ 37.42202, -122.08408, }, }
当类型是type类型的时候,也就是在java中是实体类的时候,可以不用在赋值中添加Vertex,如
var m = map[string]Vertex{ "Bell Labs": {40.68433, -74.39967}, "Google": {37.42202, -122.08408}, }
当然这个map集合也可以是数据类型,如下
var x = make(map[string]int)
var y = make(map[string]float64)
...
1.3 映射增删改查
在映射 m
中插入或修改元素,类似java中 m.put("key",elem):
m[key] = elem
获取元素,类似java中的 m.get("key"):
elem = m[key]
删除元素,类似java中的 m.remove("key") :
delete(m, key)
通过双赋值检测某个键是否存在:
elem, ok = m[key]
若 key
在 m 中,ok
为 true,elem 是具体值
;否则,ok
为 false,
elem
是该映射元素类型的零值。
同样的,当从 映射 中读取某个不存在的键时,结果是 映射 的元素类型的零值。
注 :若 elem
或 ok
还未声明,你可以使用短变量声明:
elem, ok := m[key]
2、函数值
2.1 函数值做参数值
go中的函数值也可以作为参数使用
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))
}
2.2 函数值做返回值
当然go的函数也是闭包,意思就是不仅可以作为参数值,也可以作为返回值
func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } }
func main() { pos := adder() for i := 0; i < 10; i++ { fmt.Println(pos(i)) } }
结果为:
0 1 3 6 10 15 21 28 36 45