我在查找如何在switch语句中创建结构或在switch语句中为其分配类型时遇到了一些麻烦。 这里有一些非工作代码说明了我正在尝试做的事情:
var result
switch structPickingString {
case "struct1":
result = new(struct1)
case "struct2":
result = new(struct2)
}
//unmarshall some json into the appropriate struct type
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
log.Println(err)
}
//print out that json with a function specific to that type of struct
result.Print()
我认为涉及空interface{}
的事情可能与解决这个问题有关但不幸的是我对golang仍然有点无知而且我没有看到如何让它工作
这是一个稍微修改过的代码版本的链接,用于更多上下文:https://play.golang.org/p/Rb1oaMuvmU2
问题不是定义print函数,而是基于使用结构实现的单个result
函数为Print
变量分配特定类型的结构。
如果我能提供更多信息,请告诉我。
答案 0 :(得分:3)
由于您正在调用.Print
,因此您需要使用具有该方法的接口。我认为你正在寻找像
type Printer interface {
Print()
}
func (s *struct1) Print() {
// ...
}
func (s *struct2) Print() {
// ...
}
var result Printer
switch structPickingString {
case "struct1":
result = new(struct1)
case "struct2":
result = new(struct2)
}
答案 1 :(得分:1)
您需要将“generical interface”与结构匹配。见:
> v
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
[27] NA 0 NA 0 0 0 NA NA 0 0 0 NA 0 0 0 0 0 0 0 0 0 0 0 0
通过这种方式,您可以在结构和通用接口之间进行断言。见:
//my struct1
type MyStruct1 struct {
ID int
}
//my struct2
type MyStruct2 struct {
ID int
}
//my interface
type MyStructGenerical interface {
Print()
}
//method (match with MyStructGenerical)
func (m1 MyStruct1) Print() {
println(m1.ID)
}
//method (match with MyStructGenerical)
func (m2 MyStruct2) Print() {
println(m2.ID)
}
结果是:
//here result is an generical interface
var result MyStructGenerical = nil
//checkin
switch structPickingString {
case "struct1":
tmp := new(MyStruct1)
result = tmp
case "struct2":
tmp := new(MyStruct2)
result = tmp
}
答案 2 :(得分:0)
我想你想使用像
这样的界面type ResultIface interface {
Print()
}
然后你可以做
var result ResultIface
switch structPickingString {
case "struct1":
result = new(struct1)
case "struct2":
result = new(struct2)
}
只要你的struct1和struct2通过打印函数来完成ResultIface就会打印