Go 将数据添加到结构中的接口{}
我想在结构Go 将数据添加到结构中的接口{},go,struct,interface,Go,Struct,Interface,我想在结构sample中的fmt.Println下面main()中fmt.Println添加一个数据{“foo2”:“bar2”} 剧本 我的测试 我在下面试过了 测试1: 发生错误。它的类型接口{}不支持索引 测试2: 没有错误{“foo2”:“bar2”}可以添加 第二次测试是有效的还是通用的方法?如果有直接添加数据或其他方法,请您教我。 非常感谢您抽出时间。很抱歉,我提出了一个不成熟的问题。如果您将结构的定义更改为: type sample struct { data map[st
sample
中的fmt.Println
下面main()中fmt.Println
添加一个数据{“foo2”:“bar2”}
剧本
我的测试
我在下面试过了
测试1:
发生错误。它的类型接口{}不支持索引
测试2:
没有错误<代码>{“foo2”:“bar2”}
可以添加
第二次测试是有效的还是通用的方法?如果有直接添加数据或其他方法,请您教我。
非常感谢您抽出时间。很抱歉,我提出了一个不成熟的问题。如果您将结构的定义更改为:
type sample struct {
data map[string]interface{}
}
它应该会起作用
那为什么呢?因为您将数据定义为接口{}
。但你知道这不是地图,而是一个空界面。为什么它不是一张地图?因为它也可以是int、string或其他结构。因此,您不能像其他类型一样使用该类型
在您的示例中,您总是使用
data
作为映射,因此解决方案是将数据定义为类型map[string]interface{}
我不知道出于什么原因,您希望使用空接口类型而不是map[string]interface{}类型,但这是可以做到的
type sample struct {
data interface{}
}
func (s *sample) func1() {
obj := map[string]interface{}{}
obj["foo1"] = "bar1"
s.data = obj
}
func (s *sample) addField(key, value string) {
v, _ := s.data.(map[string]interface{})
v[key] = value
s.data = v
}
func main() {
s := &sample{}
s.func1()
fmt.Println(s)
s.addField("foo2", "bar2")
fmt.Println(s)
}
每次要添加值时,必须将接口强制转换为map[string]接口{}。这也可以用来检索一个值,我相信您可以使用我提供的方法添加另一个方法
我建议不要这样做。要么您总是有一个map[string]接口{},因此您应该将其作为数据的类型,要么您必须小心,因为不能保证您有一个map[string]接口{},因此您必须相应地处理它 这是行不通的。
map[string]接口{}
实现空接口,但您希望使用空接口作为映射。这样就不行了。谢谢你的建议。但我很抱歉。我知道当使用数据映射[string]接口{}
时,可以使用s.data[“foo2”]=“bar2”
。我的问题是如何解决下面的//在这里,我想将{“foo2”:“bar2”}添加到s.data
。所以数据接口{}
也是一个条件。对不起,我解释得不好。谢谢你的建议。我可以为我找到一个解决办法。我很抱歉我的技术很差。
obj := map[string]interface{}{}
t, _ := json.Marshal(s.data)
json.Unmarshal(t, &obj)
obj["foo2"] = "bar2"
fmt.Println(obj)
type sample struct {
data map[string]interface{}
}
type sample struct {
data interface{}
}
func (s *sample) func1() {
obj := map[string]interface{}{}
obj["foo1"] = "bar1"
s.data = obj
}
func (s *sample) addField(key, value string) {
v, _ := s.data.(map[string]interface{})
v[key] = value
s.data = v
}
func main() {
s := &sample{}
s.func1()
fmt.Println(s)
s.addField("foo2", "bar2")
fmt.Println(s)
}