2015-07-22 30 views
5

Tôi đang gặp sự cố với nội dung nào đó đơn giản. Tôi đang làm việc trên một cái gì đó sử dụng tuyệt vời của codegangsta cli gói, nhưng tôi đang cố gắng truy cập vào một tài sản từ một cấu trúc lồng nhau và thất bại.Trường truy cập trong các cấu trúc lồng nhau

Như một ví dụ, tôi có:

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

Tôi có một chức năng mà mất trong sự trở lại flags []cli.Flag và cố gắng để in ra chuỗi giá trị của Name cho mỗi thành viên, nhưng tôi dường như không thể truy cập nội dung lồng nhau trong slice. Cách thích hợp để làm điều này là gì?

EDIT: Đây là những gì tôi đã làm, với những bổ sung từ câu trả lời tuyệt vời Mayank của

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

Tôi nhận được một lỗi runtime index out of range bây giờ, nhưng tôi nghĩ đó là cái gì khác tôi đang làm sai.

+0

Bạn có thể cho chúng tôi thấy những gì bạn đã cố gắng để chúng tôi có thể tinh chỉnh nó để hiển thị cho bạn không? –

Trả lời

3

tôi giả sử bạn đang truy cập vào một cái gì đó có giá trị như thế này

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

nào sẽ cung cấp cho bạn lỗi sau

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

Và vấn đề với đồng này de là bạn đang truy cập các giá trị cli.StringFlag struct thông qua một giao diện cli.Flag. Bạn cần phải chuyển đổi giao diện này thành kiểu cấu trúc thực tế.

Hy vọng mã sau sẽ làm rõ mọi thứ.

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

Cảm ơn, đó thực sự là những gì tôi đang làm và đang tìm kiếm. Điều này là hoàn hảo, và tôi nghi ngờ đó là một vấn đề về giao diện gõ. Cảm ơn! –

+0

Rất vui được trợ giúp .. –

0

như bạn không dán đoạn code đọc Name bất động sản, tôi chỉ đoán, bạn cần kiểm tra giao diện

if stringFlag, ok := flags[0].(cli.StringFlag); ok{ 
    fmt.Println(stringFlag.Name) 
} 
Các vấn đề liên quan