通过switch语句

时间:2018-04-27 00:43:37

标签: go

我在查找如何在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变量分配特定类型的结构。

如果我能提供更多信息,请告诉我。

3 个答案:

答案 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)
}

https://play.golang.org/p/W9r6UfeQSCz

答案 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
}

运行于:https://play.golang.org/p/nHrJnImsqNN

答案 2 :(得分:0)

我想你想使用像

这样的界面
type ResultIface interface {
     Print()
}

然后你可以做

 var result ResultIface

 switch structPickingString {
 case "struct1":
     result = new(struct1)
 case "struct2":
     result = new(struct2)
}

只要你的struct1和struct2通过打印函数来完成ResultIface就会打印