go - 嵌套结构中的访问字段

标签 go nested command-line-interface slice

我在处理本应简单的事情时遇到了麻烦。我正在研究使用 codegangsta 出色的 cli 包的东西,但我试图从嵌套结构访问属性但失败了。

例如,我有:

func Something() []cli.Flag {
    return []cli.Flag{
        cli.StringFlag{
            Name: awesome
            Usage: "be awesome"
           },
         cli.StringFlag{
            Name: awesome2
           },
           <etc.>
         }

我有一个函数接受返回的 flags []cli.Flag 并尝试为每个成员打印出 Name 的字符串值,但我不能'似乎无法访问 slice 中的嵌套内容。这样做的正确方法是什么?

编辑:这是我所做的,加上 Mayank 的出色回答

func PrintFlagsForDriver(name string) error {

        for driverName := range drivers {
                if name == driverName {
                        driver := drivers[driverName]
                        flags := driver.GetCreateFlags()
                        stringFlag, ok := flags[0].(cli.StringFlag)
                        if ok {
                                fmt.Println(stringFlag.Name)
                        }
                }
        }
        return fmt.Errorf("Driver %s not found", name)
}

我现在收到 index out of range 运行时错误,但我认为这是我做错的其他事情。

最佳答案

我假设您正在访问这样的值

package main

import "fmt"
import "github.com/codegangsta/cli"

func main() {

    fmt.Println("Hello, playground")
    a := Something()
    fmt.Printf("%T \n", a[0].Name)
}

func Something() []cli.Flag {
    return []cli.Flag{
        cli.StringFlag{
            Name:  "awesome",
            Usage: "be awesome",
        },
        cli.StringFlag{
            Name: "awesome2",
        },
    }
}

这会给你以下错误

./main.go:10: a[0].Name undefined (type cli.Flag has no field or method Name)

此代码的问题在于您正在通过接口(interface) cli.Flag 访问 struct cli.StringFlag 值。您需要将此接口(interface)类型转换为实际的结构类型。

希望下面的代码能让事情变得清晰。

package main

import "fmt"
import "github.com/codegangsta/cli"

func main() {

    a := Something()
    stringFlag, ok := a[0].(cli.StringFlag)
    if ok {
        fmt.Println(stringFlag.Name)
    }

}

func Something() []cli.Flag {
    return []cli.Flag{
        cli.StringFlag{
            Name:  "awesome",
            Usage: "be awesome",
        },
        cli.StringFlag{
            Name: "awesome2",
        },
    }
}

关于go - 嵌套结构中的访问字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551788/

相关文章:

css - 嵌套 LESS 到 css 类

linux - 查找在给定文件之前和之后 30 分钟创建的文件 - UNIX

ruby - 如何像常规命令一样从任何地方制作一个 Ruby 文件(在 gem 中)可执行文件?

go get -u 对带有 go1 分支的包失败

如果我包装我的对象,Golang 转换为自定义类型会失败

javascript - 在javascript中如何在具有嵌套数组的对象数组中查找值

amazon-web-services - aws ec2 描述实例 : how to filter *out* spot instances?

go - 在DDD(纯净/六角形)架构中处理数据库连接和Env配置

go - 同时读取文件

html - 如何使用 CSS 定位单独的嵌套元素