首頁 > 後端開發 > Golang > 如何有效複製未匯出欄位的 Go 結構體?

如何有效複製未匯出欄位的 Go 結構體?

Patricia Arquette
發布: 2024-12-17 13:55:12
原創
573 人瀏覽過

How Can I Effectively Clone Go Structs with Unexported Fields?

克隆具有未導出字段的結構

在Go 中,結構體中未導出的字段無法在聲明包之外訪問或修改。這在嘗試克隆此類類型的物件時提出了挑戰。

問題陳述

考慮以下類型定義:

type T struct {
    S  string
    is []int
}
登入後複製

如果我們將T 類型的一個對象分配給另一個對象,對未分配給另一個對象,對未分配給導出字段T.is 所做的更改將影響這兩個物件。這是因為簡單賦值僅建立淺表副本,且 T.is 引用保持共用。

限制

由於 T.is 的未導出性質,不能使用反射直接存取或複製它。因此,不可能用 T.is.

可能的解決方案

  • 的精確副本來克隆 T 類型的物件。提供克隆方法:如果您擁有或可以修改包含類型 T 的包,最好的解決方案是實作 Clone() 方法或該套件中的函數。此方法可以明確處理複製未匯出的欄位。
  • 使用克隆函數:如果包含類型 T 的套件無法修改,您可以考慮在另一個套件中提供自訂 Clone() 函數。此函數可以接受 T 類型的物件作為參數,並傳回一個克隆對象,其中包含所有欄位的精確副本,包括未匯出的欄位。
  • 建立一個新物件:如果無法直接複製未匯出的字段,您可以建立類型 T 的新實例並手動指派原始物件中的匯出和未匯出欄位。但是,未匯出的欄位將被設定為零值。
  • 使用反射(不安全):雖然不建議,但可以使用 unsafe 套件來繞過未匯出欄位的存取限製欄位。但是,使用此方法時應極為謹慎,因為它可能會導致運行時錯誤和未定義的行為。

注意:

重要的是要記住並不總是需要克隆具有未導出字段的結構。如果未匯出的欄位不是必需的或需要在聲明包之外進行修改,請考慮將它們匯出或提供適當的 API 來存取和修改它們。

以上是如何有效複製未匯出欄位的 Go 結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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