别名之间赋值会触发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()
总之,虽然别名类型之间的转换不会创建基础值的副本,但这一原则并不适用于将值传递给函数通常制作副本的地方。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3