2014-06-20 13 views
13

Từ các tài liệugolang - Elem Vs gián tiếp trong gói phản ánh

func (v Value) Elem() Value 

Elem trả về giá trị mà giao diện v chứa hoặc các điểm con trỏ v để. Nó hoảng sợ nếu loại của v không phải là Giao diện hoặc Ptr. Nó trả về giá trị bằng không nếu v là nil.

func Indirect(v Value) Value 

Gián tiếp trả về giá trị v trỏ tới. Nếu v là một con trỏ nil, Gián tiếp trả về một giá trị bằng không. Nếu v không phải là con trỏ, trả về gián tiếp v.

Vì vậy, tôi có thể đảm bảo an toàn những điều sau đây không?

reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem(). 

Phương pháp gián tiếp chỉ là một phương pháp thuận tiện cho phía bên phải của bên trên?

Trả lời

12

Nếu số reflect.Value là con trỏ, thì v.Elem() tương đương với reflect.Indirect(v). Nếu nó không phải là một con trỏ, sau đó họ không phải là tương đương:

  • Nếu giá trị là một giao diện sau đó reflect.Indirect(v) sẽ trả về giá trị tương tự, trong khi v.Elem() sẽ trả về giá trị năng động kiềm chế.
  • Nếu giá trị khác, thì v.Elem() sẽ gây hoảng sợ.

Trình trợ giúp reflect.Indirect dành cho trường hợp bạn muốn chấp nhận một loại cụ thể hoặc con trỏ cho loại đó. Một ví dụ là các thói quen chuyển đổi database/sql: bằng cách sử dụng reflect.Indirect, nó có thể sử dụng cùng một đường dẫn mã để xử lý các loại và con trỏ khác nhau cho các loại đó.

Các vấn đề liên quan