2015-07-22 130 views
5

我遇到了一些應該很簡單的問題。我正在使用codegangsta的優秀cli包,但我試圖從嵌套結構訪問屬性並失敗。嵌套結構中的訪問字段

舉個例子,我有:

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

我有一個函數,在返回flags []cli.Flag,並試圖打印出Name每個成員的字符串值,但我似乎無法訪問切片中的嵌套內容。這樣做的正確方法是什麼?

編輯:這是我做什麼,從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) 
} 

現在我得到一個index out of range運行時錯誤添加,但我認爲這是別的東西,我做錯了。

+0

你能告訴我們你試過什麼,所以我們可以調整它,告訴你嗎? –

回答

3

我假設你正在訪問的價值是這樣的

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

哪樣給你下面的錯誤

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

而這個問題與這個公司de是通過接口cli.Flag訪問結構體cli.StringFlag的值。您需要鍵入將此接口轉換爲實際的結構類型。

希望以下代碼能夠讓事情變得清晰。

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

謝謝,這確實是我正在做和尋找的。這是完美的,我懷疑這是一個界面打字問題。謝謝! –

+0

樂於幫忙.. –

0

,你不是代碼讀取Name財產粘貼,我只是猜測,你需要一個界面檢查

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