别名之间的赋值会触发 Go 中的复制吗?
Go 允许使用别名定义自定义类型。人们担心这些别名类型之间的转换是否会导致副本或仅仅是结构变化。
考虑这个示例:
type MyString string var s = "very long string" var ms = MyString(s) var s2 = string(s) // Are ms or s2 a full copy of s?
答案:
根据Go的转换规则,数字类型或字符串之间的非常量转换可能会因表示变化而产生运行时成本。然而,所有其他转换,例如别名之间的转换,保留原始表示而不创建副本。
因此,ms 和 s2 都不是 s 的完整副本,而是引用相同的基础值.
对函数调用的影响:
传递值时为了实现功能,通常会创建副本。但是,这不适用于别名类型。将别名类型的值分配给函数参数不会触发复制:
func foo(s MyString){ ... } foo(ms) // No copy is made when passing ms to foo()
总之,虽然别名类型之间的转换不会创建基础值的副本,但此原则并不适用于将值传递给通常进行复印的功能。
以上是Go的别名类型转换会创建副本吗?的详细内容。更多信息请关注PHP中文网其他相关文章!