说明
本章主要说明Go语言中的复杂结构
下面的示例代码来自于这里
遍历
迭代循环
- for 循环的 range 格式可以对 slice 或者 map 进行迭代循环
package main
import "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 main
import "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 main
import "fmt"
type Vertex struct {
Lat, Long float64
}
var m map[string]Vertex
func main() {
m = make(map[string]Vertex)
m["Bell Labs"] = Vertex{
40.68433, -74.39967,
}
fmt.Println(m["Bell Labs"])
}
语法
- 跟结构体语法相似,不过使用时必须有键名
package main
import "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 main
import "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 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)
}
闭包
方法作为值
- 在Go中,方法也可以作为值
package main
import (
"fmt"
"math"
)
func main() {
hypot := func(x, y float64) float64 {
return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(3, 4))
}
使用闭包
- 下面是一个闭包的例子:
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),
)
}
}
- 函数 adder 返回一个闭包。每个闭包都被绑定到其各自的 sum 变量上
坑
当从 map 中读取某个不存在的键时,结果是 map 的元素类型的零值
闭包是一个方法内的值,它来自方法体的外部的变量引用, 方法可以对这个引用值进行访问和赋值,而该方法也被绑定在这个值上
练习:斐波纳契闭包
package main
import "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())
}
}