map 基本上就是 Python 的 dict,寫過 Python 跟 JavaScript 的我一直以為是 array 的那個 map...
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,
}
檢查是否存在的寫法就特別一點,不常寫的我一定很容易忘記:
elem, ok = m[key]
if ok {
fmt.Println("exist")
} else {
fmt.Println("not exist")
}
基本上是個共通的概念,這邊就直接來做練習:
package main
import (
"golang.org/x/tour/wc"
"strings"
)
func WordCount(s string) map[string]int {
m := make(map[string]int)
for _, v := range strings.Fields(s){
m[v]++
}
return m
}
func main() {
wc.Test(WordCount)
}
赫然發現有 import 卻沒使用到的模組或宣告沒用到的變數都會在編譯時被擋,Go 真的是很嚴謹呢...
map 後面提到一些高階 function 的概念,首先是傳遞 function (我自己基本上都當成 callback 了),只能說宣告這種把 function 當變數的 function 真的是有夠麻煩的。
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
甚至連 closure 都有介紹,還記得當初學了一陣子才懂,簡單來說就是會「存著外部變數的 function」,可以讀外面的變數,也可以改外面的變數。
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),
)
}
}
練習題也是經典的 Fibonacci 數列,可以像 Python 一樣 a, b = b, a 真是方便:
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
x, y := 0, 1
return func() int {
res := x
x, y = y, x+y
return res
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}