0.目錄
1.表現
- 1.1 空值賦值
- 1.2 nil 值賦值
2.原因
- 2.1 append 并未改變原有 slice
- 2.2 如果 nil map 支持賦值
3.兩種改進設計思路
- 3.1 slice 標準
- 3.2 map 標準
1.表現
1.1 空值賦值
t := []int{}
t = append(t, 1)
fmt.Println(t) // [1]
t := map[string]int{}
t["test"] = 1
fmt.Println(t) // map[test:1]
1.2 nil 值賦值
var t []int
t = append(t, 1)
fmt.Println(t) // [1]
var t map[string]int
t["test"] = 1 // panic: assignment to entry in nil map
fmt.Println(t)
2.原因
2.1 append 并未改變原有 slice
var i []int
j := i
j = append(i, 1)
fmt.Println(i == nil) // true
fmt.Println(j == nil) // false
2.2 如果 nil map 支持賦值
var i map[string]int
j := i
i["test"] = 1
i 和 j 都是 nil 值,改變一個不應該改變另一個,(與 nil slice 的行為保持一致)
如果支持 nil map 賦值,那么在這里將會同時改變 i 和 j 的值,
i["test"] = 1 沒有回傳任何值,不像 append 回傳了一個 new slice,這是一個 statement(陳述句),不是一個 expression(運算式),
可參考相關討論:Why need a special rule for nil map?
3.兩種改進設計思路
3.1 slice 標準
var t []int
t = append(t, 1)
var t map[string]int
// 仿照 append 加入 set 全域函式
// 讓 nil map set 回傳 new map
t = set(t, "test", 1)
3.2 map 標準
var t []int
// 將 append 全域函式變為 slice 的方法
// 這樣 nil slice append 也會 panic
t.append(1)
var t map[string]int
t["test"] = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/285542.html
標籤:Go
下一篇:后端開發都應該了解的登錄漏洞
