我想创建一个可以在其他包中访问的结构,但我不想允许修改这个结构。在其他语言中,这是通过将所有字段设为私有并仅公开公共吸气剂来存档的。
使用 getter 的解决方案适用于除切片和映射之外的所有数据类型,因为默认情况下不会复制返回的切片和映射,因此可以修改它们。我想出的唯一解决方案是创建新的地图/切片并在循环中分配所有项目,但这会引入大量重复且丑陋的代码,尤其是对于大型嵌套结构。
package main
import (
"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 中使用封装并使用不同的方法?
慕田峪4524236
相关分类