una resueltos que punteros llama lenguaje hacer estructuras estructura ejercicios ejemplos dev con como anidadas anidada go nested command-line-interface slice

go - resueltos - estructuras en c ejemplos



Campo de acceso en estructuras anidadas (2)

Estoy teniendo problemas con algo que debería ser simple. Estoy trabajando en algo que usa el excelente paquete cli Codegangsta, pero estoy tratando de acceder a una propiedad desde una estructura anidada y fallando.

Como ejemplo, tengo:

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

Tengo una función que toma los flags []cli.Flag devueltos flags []cli.Flag e intenta imprimir el valor de cadena de Name para cada miembro, pero parece que no puedo acceder al contenido anidado en el sector. ¿Cuál es la forma correcta de hacer esto?

EDITAR: Esto es lo que hice, con adiciones de la excelente respuesta de 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) }

Obtengo un index out of range error de tiempo index out of range ejecución index out of range ahora, pero creo que es algo más que estoy haciendo mal.


Supongo que está accediendo al valor algo así

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

Lo cual le dará el siguiente error

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

Y el problema con este código es que está accediendo a los valores struct cli.StringFlag a través de una interfaz cli.Flag. Debe escribir convertir esta interfaz al tipo de estructura real.

Esperemos que seguir el código aclare las cosas.

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


como no pegas el código que lee la propiedad Name , supongo que necesitas una verificación de interfaz

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