为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
蓝山帝景 2021-11-01 16:52:48
例子: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?
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

规格: 转换:

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

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

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

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


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信