2014-06-21 13 views

Trả lời

30

Bạn muốn val.Type().Field(0).Name. Phương pháp Field trên reflect.Type sẽ trả về cấu trúc mô tả trường đó, bao gồm tên, trong số các thông tin khác.

Không có cách nào để truy xuất tên trường cho một reflect.Value đại diện cho một giá trị trường cụ thể, vì đó là thuộc tính của cấu trúc có chứa.

+0

"Không có cách nào để lấy tên trường cho một reflect.Value đại diện cho một parti giá trị trường cular "- Tại sao lại như thế? Không phải là loại và tên một phần của trường đó? – sat

+0

@sat Ngay sau khi bạn có 'reflect.Value' của một trường cụ thể, nó không khác với bất kỳ biến nào khác. Chỉ cấu trúc có thông tin về các trường của nó. – nemo

+0

@sat: trong ví dụ của bạn, 'val.Field (0)' không khác với 'reflect.Value' cho bất kỳ chuỗi nào khác. Nó không "nhớ" rằng nó là một phần của cấu trúc. –

14

Bạn cần Nhận trường của định nghĩa loại không phải giá trị.

http://play.golang.org/p/7Bc7MJikbJ

package main 

import "fmt" 
import "reflect" 

type A struct { 
    Foo string 
} 

func (a *A) PrintFoo(){ 
    fmt.Println("Foo value is " + a.Foo) 
} 

func main() { 
     a := &A{Foo: "afoo"} 
     val := reflect.Indirect(reflect.ValueOf(a)) 
     fmt.Println(val.Type().Field(0).Name) 
} 
+0

Ví dụ hay nhưng câu trả lời của bạn thiếu một lời giải thích. – nemo

+0

@nemo công bằng đủ :) – fabrizioM

1

Bạn cũng có thể sử dụng https://github.com/fatih/structs

// Convert the fields of a struct to a []*Field 
fields := s.Fields() 

for _, f := range fields { 
    fmt.Printf("field name: %+v\n", f.Name()) 
} 
12

Với Names phương pháp mới của gói structs nó thậm chí còn dễ dàng hơn:

package main 

import (
    "fmt" 

    "github.com/fatih/structs" 
) 

type A struct { 
    Foo string 
    Bar int 
} 

func main() { 
    names := structs.Names(&A{}) 
    fmt.Println(names) // ["Foo", "Bar"] 
} 
Các vấn đề liên quan