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)
}