gpt4 book ai didi

struct - 从结构映射调用结构

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

您好,我正在尝试类似以下示例的操作。

我作为 PHP 开发人员的背景(我知道!)让我在这方面遇到了困难。我已经阅读了反射法则和其他来源,但这超出了我的理解范围。我使用的方法可能是错误的......希望有人能指出我正确的方向。

具体的用法是版本 01 或 02 或 03 来自外部参数,基于此,我需要获取适当的结构并用数据库值填充它。

package V01
type Struct1 struct{
Field1 string
Field2 string
}

type Struct2 struct{
Field1 string
Field2 string
}

package V02
type Struct1 struct{
Field1 string
Field2 string
ExtraField1 string
}

type Struct2 struct{
Field1 string
Field2 string
ExtraField2 string
ExtraField3 string
}

var VStructs = map[string]map[string]interface{}{
"01": map[string]interface{}{
"Struct1": V01.Struct1{},
"Struct2": V01.Struct2{},
},
"02": map[string]interface{}{
"Struct1": V02.Struct1{},
"Struct2": V02.Struct2{},
},
"03" : map[string]interface{}{
"Struct1": V01.Struct1{},
"Struct2": V02.Struct2{},
},
}

 // I get the struct fieldnames and so on.
fmt.Printf("%+v\n", VStructs["01"]["Struct1"] )

// I cannot access any of the fields though because it is an interface
fmt.Println( VStructs["01"]["Struct1"].Field1 ) // PANIC!

// Type Switching is not working either since the version can be variable.
s := VStructs["01"]["Struct1"].Field1
switch x := s.(type) {
case reflect.Struct: // PANIC! reflect.Struct (type reflect.Kind) is not a type
fmt.Println("I am an struct")
default:
fmt.Println("I am an no struct")
}

所以也许可以告诉我一个合适的方法来做到这一点。或者也许是一个包装函数来返回正确的结构……目前没有任何线索。

希望它是清楚的,如果需要的话会详细说明。

最佳答案

您不能以这种方式访问​​映射内部的结构,因为可能没有结构。在您的示例中,VStructs["foo"]["bar"].Field1 是什么?您将无法知道它是否真的是 map 中的空结构,或者什么都没有, map 访问只是为您返回该类型的空值。您应该做的是显式检查:

v, ok := VStructs["01"]["Struct1"]
if !ok {
// Handle the case of the missing struct.
}
// It is also a good practice to check type assertions.
s, ok := v.(V01.Struct1)
if !ok {
// Handle the case when v is not V01.Struct1.
}
f = s.Field1

关于struct - 从结构映射调用结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26993340/

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