嵌套结构中的访问字段
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",
},
}
}
我在处理一些本应很简单的事情时遇到了问题。我正在研究使用 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",
},
}
}