別名之間的賦值會觸發 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中文網其他相關文章!