寫在前面
- map就是key-value對的數據結構,
- 而有關函數,像C/C++中,有函數指針,像javascript有閉包,Go也一樣
map
- map是一種key-value結構
- 想象一下,如果數組的下標不再規定是數字,而是可以用string類型甚至更復雜的類型,那樣會不會靈活許多
- 而map正是提供了這種可能
- 一個空的map,它的值為nil。一個nil的map是沒有key的,也不能加入key
- 可以用make函數來創建map
m := make(map[string]int)
m["apple"] = 5
m["pen"] = 7
package main
import "fmt"
type vertex struct {
x,y int
}
var m = map[string]vertex{
"home": vertex{0, 0},
"school": vertex{1,1},
}
func main() {
fmt.Println(m)
}
package main
import "fmt"
type vertex struct {
x,y int
}
var m = map[string]vertex{
"home": {0, 0},
"school": {1,1},
}
func main() {
fmt.Println(m)
}
m := make(map[string]int)
m["apple"] = 2
m := make(map[string]int)
m["apple"] = 2
temp = m["apple"]
m := make(map[string]int)
m["apple"] = 2
delete(m, "apple")
m := make(map[string]int)
m["apple"] = 2
elem, ok := m["apple"] //在能找到相應值的時候elem為相應的value,ok為true;否則,elem為相應的零值,而ok為false
函數的特殊用法
- 函數其實也是一種值,在C/C++中是一種指針
- 函數作為值,也可以像其它變量一樣,作為返回值等
- 以下直接用官方例子
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))
}
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像是全局變量,通過pos和neg都能改變它
- 且pos和neg訪問的是相互獨立的sum
- 每次調用pos或者neg,都不會讓sum歸零,而這接着上次使用的值繼續運行!
- 官方教程原話:Go functions may be closures. A closure is a function value that references variables from outside its body. The function may access and assign to the referenced variables; in this sense the function is "bound" to the variables.