如何複製具有未匯出欄位的結構?
在 Go 中,具有未導出欄位的結構在複製物件時會帶來挑戰。如果結構體的欄位未匯出,則無法在聲明包之外存取或修改它。
問題:
考慮以下 T 結構:
type T struct { S string is []int }
將一個 T 物件指派給另一個 T物件不會建立獨立副本,因為未匯出的欄位是
解決方案1:Clone方法
最直接的解決方案是在定義T的套件中提供Clone方法。此方法可以明確複製 T 的字段,包括未匯出的字段 is。
解 2:Setters
如果提供 Clone 方法不可行,則提供 setter未匯出欄位的函數,例如SetIs(),允許對
限制:
需要注意的是,這些解決方案依賴於該類型原始碼的可用性。如果使用第三方軟體包,如果不修改原始軟體包,則可能無法複製具有未匯出欄位的結構。
不安全方法(不建議):
雖然使用unsafe 套件可以繞過對未匯出欄位的存取限制,強烈建議不要使用這種方法,因為它違反了Go 的封裝原則,並可能導致執行階段錯誤。
替代選項:
如果修改未匯出的欄位不是必需的,請考慮將所需資料提取到單獨的克隆結構中。例如,可以使用反射來提取未匯出的 is 字段,保留其初始值。
var r T s := T{S: p.S}
結論:
使用未導出字段克隆結構需要仔細考慮並可能涉及特定於包的解決方案。在評估可用選項時,優先考慮程式碼安全性和封裝至關重要。
以上是如何複製具有未匯出欄位的 Go 結構體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!