• Golang nil slice 与 nil map 的不同设计


    0.目录

    1.表现

    2.原因

    3.两种改进设计思路

    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
    
  • 相关阅读:
    ACM-ICPC 2018 南京赛区网络预赛 J.Sum
    汉诺塔
    汉诺塔
    D
    D
    数学小定理
    数学小定理
    Python index()方法
    Python endswith()方法
    Python encode()方法
  • 原文地址:https://www.cnblogs.com/PyLearn/p/14845364.html
Copyright © 2020-2023  润新知