首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过开关语句分配类型/创建结构

通过开关语句分配类型/创建结构
EN

Stack Overflow用户
提问于 2018-04-27 00:43:37
回答 3查看 1.6K关注 0票数 0

我在弄清楚如何在switch语句中创建struct或在switch语句中为其分配类型时遇到了一些困难。下面是一些不起作用的代码,说明我试图做什么:

代码语言:javascript
运行
复制
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函数将特定类型的结构分配给Print变量。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-27 00:53:31

由于您正在调用.Print,所以需要使用具有该方法的接口。我想你是在找

代码语言:javascript
运行
复制
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

票数 4
EN

Stack Overflow用户

发布于 2018-04-27 01:06:36

您需要将“通用接口”与结构匹配。见此:

代码语言:javascript
运行
复制
//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)
}

通过这种方式,您可以在结构和通用接口之间进行断言。见此:

代码语言:javascript
运行
复制
//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
}

结果是:

代码语言:javascript
运行
复制
//unmarshall some json into the appropriate struct type
if err := json.NewDecoder(body()).Decode(&result); err != nil {
    log.Println(err)
}

//print out that json with a function specific to that type of struct
tmp := result.(*MyStruct1)
tmp.Print()
// or
result.Print()

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

票数 1
EN

Stack Overflow用户

发布于 2018-04-27 00:58:48

我想你想用一个像

代码语言:javascript
运行
复制
type ResultIface interface {
     Print()
}

那你就可以

代码语言:javascript
运行
复制
 var result ResultIface

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

只要您的struct1和struct2有一个打印函数来实现ResultIface,它就会打印出来。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50053711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档