为了账号安全,请及时绑定邮箱和手机立即绑定

在golang中的if条件的基础上重写一个变量类型

在golang中的if条件的基础上重写一个变量类型

Go
噜噜哒 2022-06-27 16:39:40
我来自 python 背景和 Golang 的新手。我开始用 Golang 写一些代码,遇到了一个基于 if 条件设置数据类型的问题。在使用 Govmomi 模块时,我遇到了一个接受最后一个参数作为接口的Retrieve方法。在我的脚本中,我正在检查如下参数    var hss []mo.HostSystem    var ds []mo.Datastore    if command == "VMFS" {        err = v.Retrieve(ctx, []string{commandChoices[command]}, []string{"name", "summary"}, &ds)        if err != nil {            log.Fatal(err)        }        for _, host := range ds {            fmt.Println(host.Name)        }    } else {        err = v.Retrieve(ctx, []string{commandChoices[command]}, []string{"name", "summary"}, &hss)        if err != nil {            log.Fatal(err)        }        for _, host := range hss {            fmt.Println(host.Name)    }更多此代码是我想避免但不确定如何根据 if 条件设置数据类型的样板代码。我正在寻找类似的东西if command == "VMFS" {dss = []mo.Datasore} else {dss = []mo.HostSystem}然后将 dss 作为最后一个参数传递给Retrieve方法。非常感谢任何帮助。
查看完整描述

3 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

用参数的类型声明变量dss。根据需要为变量赋值。


var dss interface{}

if command == "VMFS" {

    dss = &[]mo.Datastore{}

} else {

    dss = &[]mo.HostSystem{}

}

err = v.Retrieve(ctx, []string{commandChoices[command]}, []string{"name", "summary"}, dss)

if err != nil {

    log.Fatal(err)

}


查看完整回答
反对 回复 2022-06-27
?
富国沪深

TA贡献1790条经验 获得超9个赞

你想要的是一个空接口,就像你的方法接收到的一样。你也可以看看这个例子https://tour.golang.org/methods/14


在您的特定情况下,您想要:


var dss interface{}

if command == "VMFS"{

  dss = []mo.Datasore

}else{

  dss = []mo.HostSystem

}


查看完整回答
反对 回复 2022-06-27
?
炎炎设计

TA贡献1808条经验 获得超4个赞

A_kat 和 Muffin 对答案进行了一些更改。


你可以做:


if command == "VMFS" {

  dss := []mo.Datasore{}

}else{

  dss := []mo.HostSystem{}

}


err = v.Retrieve(ctx, []string{commandChoices[command]}, []string{"name", "summary"}, &dss)

if err != nil {

    log.Fatal(err)

}

迭代范围时,这不会给您错误dss


查看完整回答
反对 回复 2022-06-27
  • 3 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信