別名之間賦值會觸發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