经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Golang nil slice 与 nil map 的不同设计
来源:cnblogs  作者:PyLearn  时间:2021/6/7 9:14:24  对本文有异议

0.目录

1.表现

2.原因

3.两种改进设计思路

1.表现

1.1 空值赋值

  1. t := []int{}
  2. t = append(t, 1)
  3. fmt.Println(t) // [1]
  1. t := map[string]int{}
  2. t["test"] = 1
  3. fmt.Println(t) // map[test:1]

1.2 nil 值赋值

  1. var t []int
  2. t = append(t, 1)
  3. fmt.Println(t) // [1]
  1. var t map[string]int
  2. t["test"] = 1 // panic: assignment to entry in nil map
  3. fmt.Println(t)

2.原因

2.1 append 并未改变原有 slice

  1. var i []int
  2. j := i
  3. j = append(i, 1)
  4. fmt.Println(i == nil) // true
  5. fmt.Println(j == nil) // false

2.2 如果 nil map 支持赋值

  1. var i map[string]int
  2. j := i
  3. 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 标准

  1. var t []int
  2. t = append(t, 1)
  1. var t map[string]int
  2. // 仿照 append 加入 set 全局函数
  3. // 让 nil map set 返回 new map
  4. t = set(t, "test", 1)

3.2 map 标准

  1. var t []int
  2. // 将 append 全局函数变为 slice 的方法
  3. // 这样 nil slice append 也会 panic
  4. t.append(1)
  1. var t map[string]int
  2. t["test"] = 1

原文链接:http://www.cnblogs.com/PyLearn/p/14845364.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号