基础四

来源:互联网 发布:小米pad连接 Mac 编辑:程序博客网 时间:2024/04/30 01:23

  • 说明
  • 遍历
    • 迭代循环
  • 键值对
    • 声明
    • 语法
    • 赋值
  • 闭包
    • 方法作为值
    • 使用闭包

说明

  • 本章主要说明Go语言中的复杂结构

  • 下面的示例代码来自于这里

遍历

迭代循环

  • for 循环的 range 格式可以对 slice 或者 map 进行迭代循环
package mainimport "fmt"var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}func main() {    for i, v := range pow {        fmt.Printf("2**%d = %d\n", i, v)    }}
  • 可以通过 _ 来忽略序号或者值
package mainimport "fmt"func main() {    pow := make([]int, 10)    for i := range pow {        pow[i] = 1 << uint(i)    }    for _, value := range pow {        fmt.Printf("%d\n", value)    }}

键值对

声明

  • map 映射键到值
package mainimport "fmt"type Vertex struct {    Lat, Long float64}var m map[string]Vertexfunc main() {    m = make(map[string]Vertex)    m["Bell Labs"] = Vertex{        40.68433, -74.39967,    }    fmt.Println(m["Bell Labs"])}

语法

  • 跟结构体语法相似,不过使用时必须有键名
package mainimport "fmt"type Vertex struct {    Lat, Long float64}var m = map[string]Vertex{    "Bell Labs": Vertex{        40.68433, -74.39967,    },    "Google": Vertex{        37.42202, -122.08408,    },}func main() {    fmt.Println(m)}
  • 上面的代码中,Vertex也可以省略,代码如下:
package mainimport "fmt"type Vertex struct {    Lat, Long float64}var m = map[string]Vertex{    "Bell Labs": {40.68433, -74.39967},    "Google":    {37.42202, -122.08408},}func main() {    fmt.Println(m)}

赋值

  • 在 map m 中插入或修改一个元素
m[key] = elem
  • 获得某个元素元素
elem = m[key]
  • 删除元素
delete(m, key)
  • 检测某个值是否存在
elem, ok = m[key]
  • 下面是一个完整的示例
package mainimport "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)}

闭包

方法作为值

  • 在Go中,方法也可以作为值
package mainimport (    "fmt"    "math")func main() {    hypot := func(x, y float64) float64 {        return math.Sqrt(x*x + y*y)    }    fmt.Println(hypot(3, 4))}

使用闭包

  • 下面是一个闭包的例子:
package mainimport "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),        )    }}
  • 函数 adder 返回一个闭包。每个闭包都被绑定到其各自的 sum 变量上

  • 当从 map 中读取某个不存在的键时,结果是 map 的元素类型的零值

  • 闭包是一个方法内的值,它来自方法体的外部的变量引用, 方法可以对这个引用值进行访问和赋值,而该方法也被绑定在这个值上

  • 练习:斐波纳契闭包

package mainimport "fmt"// fibonacci 函数会返回一个返回 int 的函数。func fibonacci() func() int {    x:=0    y:=1    return func() int{        sum := x + y        x=y        y=sum        return sum    }}func main() {    f := fibonacci()    for i := 0; i < 10; i++ {        fmt.Println(f())    }}
0 0
原创粉丝点击