2015-07-22 14 views
5

Mam problem z czymś, co powinno być proste. Pracuję nad czymś, co używa doskonałego pakietu codegangsta's cli, ale próbuję uzyskać dostęp do właściwości z zagnieżdżonej struktury i nie działa.Pole dostępu w zagnieżdżonych strukturach

Jako przykład mam:

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

Mam funkcję, która pobiera w zwróconym flags []cli.Flag i próbuje wydrukować wartości string Name dla każdego członka, ale nie może wydawać się, aby uzyskać dostęp zagnieżdżona zawartość w plasterku. Jaki jest właściwy sposób robienia tego?

EDIT: Oto co zrobiłem, z dodatkami z doskonałą odpowiedzią Mayank za

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

Dostaję błąd index out of range wykonawczego teraz, ale myślę, że to coś innego robię źle.

+0

Czy możesz pokazać nam, co próbujesz, abyśmy mogli go ulepszyć, aby Ci pokazać? –

Odpowiedz

3

Zakładam, że jesteś dostępu wartość coś takiego

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

który daje następujący błąd:

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

I problem z tym co de jest to, że uzyskujesz dostęp do wartości struct cli.StringFlag poprzez interfejs cli.Flag. Musisz wpisać przekonwertować ten interfejs na rzeczywisty typ struktury.

Mam nadzieję, że poniższy kod sprawi, że sprawy staną się jasne.

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

Dzięki, to jest właśnie to, co robiłem i czego szukałem. To jest idealne i podejrzewam, że był to problem z pisaniem na klawiaturze. Dzięki! –

+0

Chętnie pomożemy .. –

0

jak nie wkleić kod czytanie właściwość Name, po prostu odgadnąć, trzeba czek interfejsu

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