2015-07-22 16 views
5

Ich habe Probleme mit etwas, das einfach sein sollte. Ich arbeite an etwas, das das ausgezeichnete cli Paket von codegansta verwendet, aber ich versuche, auf eine Eigenschaft von einer verschachtelten Struktur zuzugreifen und zu scheitern.Zugriffsfeld in verschachtelten Strukturen

Als Beispiel habe ich:

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

Ich habe eine Funktion, die in der zurück flags []cli.Flag nimmt und versucht, aus dem String-Wert von Name für jedes Mitglied zu drucken, aber ich kann nicht für den Zugriff scheinen der verschachtelte Inhalt im Slice. Was ist der richtige Weg, dies zu tun?

EDIT: Hier ist, was ich tat, mit Zusätzen von Mayank ausgezeichneter Antwort

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

Ich erhalte ein index out of range Laufzeitfehler jetzt, aber ich denke, das ist etwas, was ich falsch mache.

+0

Können Sie uns zeigen, was Sie versucht haben, damit wir es optimieren können, um es Ihnen zu zeigen? –

Antwort

3

Ich gehe davon aus Sie den Wert etwas zugreifen wie diese

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

denen geben Sie folgenden Fehler

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

Und das Problem mit dieser co de ist, dass Sie auf die struct cli.StringFlag Werte über eine Schnittstelle cli.Flag zugreifen. Sie müssen diese Schnittstelle in den tatsächlichen Strukturtyp konvertieren.

Hoffentlich wird der folgende Code die Dinge klarstellen.

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

Danke, das ist in der Tat, was ich getan habe und suchen. Das ist perfekt, und ich vermute, dass es sich um ein Problem bei der Eingabe von Schnittstellen handelte. Vielen Dank! –

+0

Gerne helfen .. –

0

, wie Sie den Code nicht fügen Sie den Name Eigenschaft lesen, ich nur raten, müssen Sie eine Schnittstelle Check

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