Golang nil slice 与 nil map 的不同设计
程序员文章站
2022-03-07 15:15:30
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 = appe ......
0.目录
1.
- 1.1
- 1.2
2.
- 2.1
- 2.2
3.
- 3.1
- 3.2
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