Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Go中别名类型之间的转换是否创建副本?_String_Go_Type Conversion_Type Alias - Fatal编程技术网

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

String Go中别名类型之间的转换是否创建副本?,string,go,type-conversion,type-alias,String,Go,Type Conversion,Type Alias,例如: type MyString string var s = "very long string" var ms = MyString(s) var s2 = string(s) ms或s2是否是s的完整副本(就像使用[]字节一样)?或者它们只是一个字符串结构副本(将实际值保留在指针中) 如果我们把它传递给一个函数呢?例如: func foo(s MyString){ ... } foo(ms(s)) // do we copy s here? 特定规则适用于数值类型之间或与字

例如:

type MyString string 
var s = "very long string"
var ms = MyString(s)
var s2 = string(s)
ms
s2
是否是
s
的完整副本(就像使用
[]字节
一样)?或者它们只是一个字符串结构副本(将实际值保留在指针中)

如果我们把它传递给一个函数呢?例如:

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

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

因此,在自定义类型的基础类型之间进行转换并从中进行转换不会产生副本

将值传递给函数或方法时,将创建并传递一个副本。如果将
字符串
传递给函数,则只会复制和传递描述
字符串
的结构,因为
字符串
是不可变的


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

记住Go中的所有内容都是一个值,所有赋值都是该值的副本
foo(ms))
确实复制了一份,但不是因为转换。这是正确的。下面是一些
不安全的。指针
黑客攻击来证明字符串头确实是相同的:。