go-映射、函数值

127 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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))
   }
}