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

我来自 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方法。非常感谢任何帮助。


噜噜哒
浏览 177回答 3
3回答

繁花如伊

用参数的类型声明变量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)}

富国沪深

你想要的是一个空接口,就像你的方法接收到的一样。你也可以看看这个例子https://tour.golang.org/methods/14在您的特定情况下,您想要:var dss interface{}if command == "VMFS"{  dss = []mo.Datasore}else{  dss = []mo.HostSystem}

炎炎设计

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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go