在 Go 中使用別名類型時,人們可能想知道別名與其基礎類型之間的轉換是否會導致結果副本。為了探討這個問題,讓我們來分析一個例子:
type MyString string var s = "very long string" var ms = MyString(s) var s2 = string(ms)
問題: ms 或s2 是s 的完整副本(就像[]byte(s) 一樣),還是它們僅表示字串結構的副本(保存指向原始字串的指標) value)?
答案:
根據Go 轉換規範,「所有其他轉換僅更改類型,但不會更改x 的表示形式。」因此,在自自定義類型的基礎類型之間進行轉換不會建立副本。在這種情況下,ms 和 s2 不是 s 的副本,而只是同一基礎值的不同表示。
將別名類型傳遞給函數:
傳遞別名時輸入函數,就會產生該值的副本。但是,副本實際上不會建立基礎值的新實例。例如:
func foo(s MyString) { ... } foo(ms(s)) // No copy is made here
這裡,傳遞給函數的副本是 MyString 描述子的副本,而不是 ms 引用的實際字串。
以上是Go 別名型別轉換:它是否會建立底層資料的深層副本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!