【问题标题】:What exactly is (nil) doing in this context []string(nil)在这种情况下 (nil) 到底在做什么 []string(nil)
【发布时间】:2016-01-09 00:53:40
【问题描述】:

我在看 Slice Tricks:https://github.com/golang/go/wiki/SliceTricks

我注意到在他们的复制示例中他们有[]T(nil)

我以前从未见过像这样的(nil),我找不到任何关于使用它的文档或它到底完成了什么(我知道它是不言自明的,但我想知道它与make 的作用相同)或[]string{}

我可以通过谷歌搜索“golang (nil) slice”找到的唯一参考是

由于切片的零值 (nil) 的作用类似于零长度切片,因此您可以声明切片变量,然后在循环中附加到它:

但它没有说明它可以在哪里使用或它完成了什么,比如我可以将它用于结构或我想要的任何东西吗?

例如:

主包

导入“日志”

func main() {
    str := []string{"Hello", "Bye", "Good Day", "????????"}
    cop := append([]string(nil), str...)    

    log.Println(str)
    log.Println(cop)
}

我只是好奇(nil) 是如何运作的,以及它可以在什么上运作。

喜欢

[]string(nil)

操作同

[]string{}

或者这里有什么区别

【问题讨论】:

    标签: go


    【解决方案1】:

    这是一种类型转换,将nil 转换为切片。

    这些是等价的

    var t []string
    t := []string(nil)
    

    在这两种情况下,t 的类型为 []stringt == nil

    【讨论】:

    • 那么这与interfaceType.(string) 类似吗?它的运行方式是否与[]string{} 相同?
    • 没有。 .(type) 是一个“类型断言”。 []string{} 语法分配一个切片,而不是 nil
    • 那么在附加示例中使用[]string(nil) 而不是[]string{} 有什么好处?
    • 后者需要分配。
    • Ohhhhhh 我现在从不同的角度看待它,它与uint64(2) 相同,出于某种原因,我只是无法看到它被包裹在nil 和@987654335 上@。谢谢
    【解决方案2】:
    list := []string(nil) // list is an empty slice of strings 
    

    func append(slice []Type, elems ...Type) []Type

    函数接受一个字符串切片和一个可变长度的字符串列表,并返回一个字符串列表附加到末尾的切片。

    所以:

    cop := append([]string(nil), str...) 
    

    将创建一个空的字符串切片并将字符串附加到“str”中并返回结果。

    这个结果切片是一个副本,因为它以相同的顺序具有所有相同的值。

    【讨论】:

    • 感谢您的回复,我知道 append 是如何工作的,我严格地说 []string(nil) 它本身,我很好奇 (nil) 是如何运作的以及它可以运作什么,附加只是一个例子,我想知道使用[]string{}[]string(nil) 是否有任何好处
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多