【问题标题】:Does conversion between alias types in Go create copies?Go 中别名类型之间的转换是否会创建副本?
【发布时间】:2015-11-22 02:17:05
【问题描述】:

例子:

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

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

如果我们将 this 传递给函数会怎样?例如:

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

【问题讨论】:

  • 记住,Go 中的 everything 都是一个值,所有的赋值都是该值的副本。 foo(ms(s)) 确实复制了一份,但不是因为转换。

标签: string go type-conversion type-alias


【解决方案1】:

Spec: Conversions:

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

因此,与自定义类型的基础类型相互转换不会复制它。

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

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

【讨论】:

  • 这是正确的。这里有一些unsafe.Pointer hacking 来证明字符串头确实是相同的:play.golang.org/p/0khVz09-Jc
  • 引用的段落中没有提到复制。
猜你喜欢
  • 2013-11-03
  • 2014-05-25
  • 2021-10-12
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多