Go中别名类型之间的转换是否会创建副本? [英] Does conversion between alias types in Go create copies?

查看:106
本文介绍了Go中别名类型之间的转换是否会创建副本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

示例:

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

mss2s的完整副本吗(就像使用[]byte(s)一样)?还是它们只是一个字符串结构副本(将实际值保留在指针中)?

Are ms or s2 a full copy of s (as it would be done with []byte(s))? Or they are just a string struct copies (which keeps the real value in a pointer)?

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

What if we are passing this to a function? E.g.:

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

推荐答案

规范:转化:

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

Specific rules apply to (non-constant) conversions between numeric types or to and from a string type. These conversions may change the representation of x and incur a run-time cost. All other conversions only change the type but not the representation of x.

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

So converting to and from the underlying type of your custom type does not make a copy if it.

将值传递给函数或方法时,将创建并传递一个副本.如果将string传递给函数,由于string是不可变的,因此仅复制和传递描述string的结构.

When you pass a value to a function or method, a copy is made and passed. If you pass a string to a function, only the structure describing the string will be copied and passed, since strings are immutable.

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

Same is true if you pass a slice (slices are also descriptors). Passing a slice will make a copy of the slice descriptor but it will refer to the same underlying array.

这篇关于Go中别名类型之间的转换是否会创建副本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆