一尘不染

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

go

例:

type MyString string 
var s = "very long string"
var ms = MyString(s)
var s2 = string(s)

mss2的完整副本s(将通过来完成[]byte(s))?还是它们只是一个字符串结构副本(将真实值保留在指针中)?

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

func foo(s MyString){
  ...
}
foo(ms(s))  // do we copy s here?

阅读 226

收藏
2020-07-02

共1个答案

一尘不染

规格:转化次数:

特定规则适用于数字类型之间或字符串类型之间的(非恒定)转换。这些转换可能会更改的表示形式x并产生运行时成本。
所有其他转换只会更改类型,而不会更改的表示形式x

因此,如果要在自定义类型的基础类型之间来回转换,则不会进行复制。

当您将值传递给函数或方法时,将创建并传递一个副本。如果将a传递string给函数,则string由于strings是不可变的,因此只会复制和传递描述的结构。

如果您传递一个切片(切片也是描述符),也是如此。传递切片将复制切片描述符,但它将引用相同的基础数组。

2020-07-02