Go語言中的map及函數的特殊用法


寫在前面

  • 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)
}
  • 像上面例子中只有一個value時也可以這樣賦值
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)
}
  • 對map進行插入或者更新的操作
m := make(map[string]int)
m["apple"] = 2
  • 對map進行取數據
m := make(map[string]int)
m["apple"] = 2
temp = m["apple"]
  • 對map進行按key刪除操作
m := make(map[string]int)
m["apple"] = 2
delete(m, "apple")
  • 查找map中是否存在某個key值的映射
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))
}
  • Go還能允許函數的閉包,同樣給出官方例子
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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM