欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

ij 都是 nil 值,改变一个不应该改变另一个。(与 nil slice 的行为保持一致)

如果支持 nil map 赋值,那么在这里将会同时改变 ij 的值。

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