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

Rob*_*mba 3 string type-conversion go type-alias

例:

type MyString string 
var s = "very long string"
var ms = MyString(s)
var s2 = string(s)
Run Code Online (Sandbox Code Playgroud)

是(ms或将完成)s2的完整副本?或者它们只是一个字符串结构副本(它将实际值保存在指针中)?如果我们将它传递给函数怎么办?例如:s[]byte(s)

func foo(s MyString){
  ...
}
foo(ms(s))  // do we copy s here?
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 8

规格:转换:

特定规则适用于数字类型之间或字符串类型之间的(非常量)转换.这些转换可能会改变x运行时成本并导致运行时成本.所有其他转换仅更改类型,但不更改表示x.

因此,在自定义类型的基础类型之间进行转换并不会复制.

将值传递给函数或方法时,会生成并传递副本.如果将a传递string给函数,则只会string复制和传递描述该函数的结构,因为strings是不可变的.

如果传递切片也是如此(切片也是描述符).传递切片将创建切片描述符的副本,但它将引用相同的基础数组.

  • 这是对的.这里有一些`unsafe.Pointer`黑客来证明字符串标题确实相同:http://play.golang.org/p/0khVz09-Jc. (3认同)