Go 中别名类型之间的转换是否会创建副本?

例子:


type MyString string 

var s = "very long string"

var ms = MyString(s)

var s2 = string(s)

是ms或s2的完整副本s(就像用 完成的那样[]byte(s))?或者它们只是一个字符串结构副本(将实际值保存在指针中)?


如果我们将它传递给一个函数怎么办?例如:


func foo(s MyString){

  ...

}

foo(ms(s))  // do we copy s here?


蓝山帝景
浏览 181回答 1
1回答

呼如林

规格: 转换:特定规则适用于数字类型之间或与字符串类型之间的(非常量)转换。这些转换可能会改变表示x并产生运行时成本。所有其他转换仅更改类型,而不更改x.因此,如果在自定义类型的基础类型之间进行转换,则不会进行复制。当您将值传递给函数或方法时,会生成并传递一个副本。如果将 a 传递string给函数,则只会string复制和传递描述 的结构,因为strings 是不可变的。如果你传递一个切片(切片也是描述符)也是如此。传递切片将制作切片描述符的副本,但它将引用相同的底层数组。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go