我想創建一個可以在其他包中訪問的結構,但我不想允許修改這個結構。在其他語言中,這是通過將所有字段設為私有并僅公開公共吸氣劑來存檔的。使用 getter 的解決方案適用于除切片和映射之外的所有數據類型,因為默認情況下不會復制返回的切片和映射,因此可以修改它們。我想出的唯一解決方案是創建新的地圖/切片并在循環中分配所有項目,但這會引入大量重復且丑陋的代碼,尤其是對于大型嵌套結構。package mainimport ( "fmt")type OtherStruct struct { prop string}type Struct struct { prop map[string]OtherStruct}func (s Struct) Prop() map[string]OtherStruct { return s.prop}func (s Struct) Prop2() map[string]*OtherStruct { prop := make(map[string]*OtherStruct, 0) for k := range s.prop { v := s.prop[k] prop[k] = &v } return prop}func main() { var s Struct; // Simple getter s = Struct{make(map[string]OtherStruct, 0)} p1 := s.Prop() fmt.Println(s) // &{map[]} p1["something"] = OtherStruct{"test"} fmt.Println(s) // {map[something:{test}]} // Getter which copies map s = Struct{make(map[string]OtherStruct, 0)} p2 := s.Prop2() fmt.Println(s) // &{map[]} p2["something"] = &OtherStruct{"test"} fmt.Println(s) // &{map[]}}有沒有更好的方法在 Go 中封裝切片/映射?或者我根本不應該在 Go 中使用封裝并使用不同的方法?
1 回答

慕田峪4524236
TA貢獻1875條經驗 獲得超5個贊
返回切片或映射值是慣用的 Go。你的包的用戶將知道這些數據結構在 Go 中是如何工作的。
在您的示例中, 的用戶Struct應該知道在返回的地圖中添加新條目將反映同一地圖的任何其他用戶。
// Simple getter
s = Struct{make(map[string]OtherStruct, 0)}
p1 := s.Prop()
fmt.Println(s) // &{map[]}
p1["something"] = OtherStruct{"test"}
fmt.Println(s) // {map[something:{test}]}
只有在并發的情況下你才應該擔心這些事情。也就是說,當多個 goroutine 正在訪問并可能更改切片或映射中的元素時。
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報
0/150
提交
取消