2016-05-24 12 views
1

構造体のフィールドとメソッドをGoLangで動的にリストする方法は?たとえば、id、name、age、およびすべてのメソッド名として出力を取得したいとします。構造体フィールドとメソッドを動的にリストする

type Student struct { 
    id int 
    name string 
    age int 
} 

func (s *Student) setId(i int) { 
    s.id = i 
} 

func (s *Student) getId() int { 
    return s.id 
} 

func (s *Student) setName(n string) { 
    s.name = n 
} 

func (s *Student) getName() string { 
    return s.name 
} 

func (s *Student) setAge(a int) { 
    s.age = a 
} 

func (s *Student) getAge() int { 
    return s.age 
} 

func main() { 
    st := Student{1,"Jack",22} 
    fmt.Println(st.getId()," ",st.getName()," ",st.getAge()) 

} 
+0

オブジェクトの文字列表現に興味があり、 'Stringer'インターフェースを実装したいのですか? –

+0

あなたはどんな出力をしたいですか? – Apin

+0

[フィールドのString()で構造体を印刷するにはどうすればいいですか?](http://stackoverflow.com/questions/33142594/how-to-print-struct-with-string-of-fields) – icza

答えて

2

実行時に構造体に関する情報を取得するには、パッケージreflectを使用する必要があります。最初に、構造体の型を取得し、それを反復することができます。しかし、あなたの例では、タイプmain.Studentには関連するメソッドはありませんが、タイプは*main.Studentです。あなたのコードについて

func main() { 
    s := Student{1, "Jack", 22} 
    t := reflect.TypeOf(s) 
    ptr_t := reflect.TypeOf(&s) 

    methods := make([]string, 0) 
    for i := 0; i < ptr_t.NumMethod(); i++ { 
     methods = append(methods, ptr_t.Method(i).Name) 
    } 

    fields := make([]string, 0) 
    for i := 0; i < t.NumField(); i++ { 
     fields = append(fields, t.Field(i).Name) 
    } 

    fmt.Println(methods) 
    # [getAge getId getName setAge setId setName] 
    fmt.Println(fields) 
    # [id name age] 

} 

ポイント:パッケージ間のフィールドとメソッドの輸出がどのように行われるかを見てここで

は、あなたがそれらの情報を取得することができる方法の一例です。小文字で始まるすべてのフィールドとメソッドは、パッケージの外部からアクセスできないためです。大文字で始める必要があります。

別のポイント:通常、Goコードにはゲッターとセッターはありません。 structフィールドを読み書きする場合は、大文字で始めるだけです。

+0

ありがとう! –

関連する問題