gpt4 book ai didi

go - 我应该在 Go 中封装 slice 和 maps 吗?如果可以,该怎么做?

转载 作者:数据小太阳 更新时间:2023-10-29 03:40:26 25 4
gpt4 key购买 nike

我想创建一个可以在其他包中访问的结构,但我不想允许修改这个结构。在其他语言中,这是通过将所有字段设为私有(private)并仅公开公共(public) setter/getter 来存档的。

使用 getter 的解决方案适用于除 slice 和映射之外的所有数据类型,因为默认情况下不会复制返回的 slice 和映射,因此可以修改它们。我想出的唯一解决方案是创建新的 map /slice 并在循环中分配所有项目,但这会引入大量重复且丑陋的代码,尤其是对于大型嵌套结构。

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 中封装 slice/映射?或者我根本不应该在 Go 中使用封装并使用不同的方法?

最佳答案

返回 slice 或映射值是惯用的 Go。你的包的用户将知道这些数据结构在 Go 中是如何工作的。

在您的示例中,Struct 的用户应该知道在返回的 map 中添加新条目会反射(reflect)同一 map 的任何其他用户。

// 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 正在访问并可能更改 slice 或映射中的元素时。

关于go - 我应该在 Go 中封装 slice 和 maps 吗?如果可以,该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56342396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com