嵌套结构中的访问字段

Access field in nested structs

我在处理一些本应很简单的事情时遇到了问题。我正在研究使用 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 的字符串值,但我似乎无法访问片。这样做的正确方法是什么?

编辑:这是我所做的,加上 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 运行时错误,但我认为这是我做错的其他事情。

因为你没有粘贴读取 Name 属性 的代码,我只是猜测,你需要一个接口检查

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

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

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)

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

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

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",
        },
    }
}