猿问

从结构映射调用结构

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


我作为 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")

 }

所以也许可以告诉我这样做的适当方式。或者也许是一个包装函数来返回正确的结构......此时没有线索。


希望它很清楚,如果被要求会详细说明。


慕莱坞森
浏览 194回答 0
0回答
随时随地看视频慕课网APP

相关分类

Go
我要回答