首頁 > 後端開發 > Golang > Go 別名型別轉換:它是否會建立底層資料的深層副本?

Go 別名型別轉換:它是否會建立底層資料的深層副本?

Barbara Streisand
發布: 2024-12-21 16:20:10
原創
330 人瀏覽過

Go Alias Type Conversion: Does it Create Deep Copies of Underlying Data?

Go 中的別名型別轉換:它會建立副本嗎?

在 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板