2015-07-22 19 views
5

Ho problemi con qualcosa che dovrebbe essere semplice. Sto lavorando a qualcosa che utilizza l'eccellente pacchetto cli di codegangsta, ma sto provando ad accedere a una proprietà da una struttura nidificata e fallendo.Campo di accesso nelle strutture nidificate

Per fare un esempio, ho:

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

ho una funzione che prende in restituita flags []cli.Flag e cerca di stampare il valore stringa di Name per ogni membro, ma non riesco ad accedere il contenuto annidato nella sezione. Qual è il modo corretto di farlo?

EDIT: Ecco quello che ho fatto, con aggiunte di ottima risposta di 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) 
} 

sto ricevendo un errore di runtime index out of range ora, ma penso che sia un'altra cosa che sto facendo male.

+0

Puoi mostrarci cosa hai provato in modo che possiamo modificarlo per mostrarti? –

risposta

3

Presumo si accede al valore di qualcosa di simile

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

che sarà dare il seguente errore

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

E il problema con questo co de è che tu stia accedendo ai valori della struttura cli.StringFlag attraverso un'interfaccia cli.Flag. È necessario digitare convertire questa interfaccia in un tipo di struttura reale.

Speriamo che seguire il codice chiarisca le cose.

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

Grazie, è proprio quello che stavo facendo e cercando. Questo è perfetto e ho il sospetto che si trattasse di un problema di digitazione dell'interfaccia. Grazie! –

+0

Felice di aiutare .. –

0

come non si incolla il codice di lettura di proprietà Name, ho appena immagino, è necessario un controllo di interfaccia

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