亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我應該在 Go 中封裝 slice 和 maps 嗎?如果可以,該怎么做?

我應該在 Go 中封裝 slice 和 maps 嗎?如果可以,該怎么做?

Go
哈士奇WWW 2023-06-19 17:10:57
我想創建一個可以在其他包中訪問的結構,但我不想允許修改這個結構。在其他語言中,這是通過將所有字段設為私有并僅公開公共吸氣劑來存檔的。使用 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 正在訪問并可能更改切片或映射中的元素時。


查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號