Tôi đang cố triển khai phương pháp thay đổi giá trị của các trường trong đối tượng có thể có cấu trúc tùy ý. Sự tra tấn của các trường là không có vấn đề gì khi tôi có con trỏ tới một cấu trúc. Nhưng tôi không thể quản lý để thay đổi các lĩnh vực khi tôi có một giao diện mà không quấn một con trỏ đến một cấu trúc nhưng struct chính nó, trong ngắn hạn:Phản chiếu Golang: Không thể đặt trường giao diện bao quanh cấu trúc
// The following doesn't work
var x interface{} = A{Str: "Hello"}
// This panics: reflect: call of reflect.Value.Field on ptr Value
reflect.ValueOf(&x).Field(0).SetString("Bye")
// This panics: reflect: call of reflect.Value.Field on interface Value
reflect.ValueOf(&x).Elem().Field(0).SetString("Bye")
// This panics: reflect: reflect.Value.SetString using unaddressable value
reflect.ValueOf(&x).Elem().Elem().Field(0).SetString("Bye")
// This prints `false`. But I want this to be settable
fmt.Println(reflect.ValueOf(&x).Elem().Elem().Field(0).CanSet())
// This works
var z interface{} = &A{Str: "Hello"}
// This prints `true`
fmt.Println(reflect.ValueOf(z).Elem().Field(0).CanSet())
Trong dài: http://play.golang.org/p/OsnCPvOx8F
Tôi đã đọc The Laws of Reflection vì vậy tôi biết rằng tôi chỉ có thể sửa đổi các trường khi tôi có một con trỏ đến một cấu trúc. Vì vậy, câu hỏi của tôi bây giờ là: Làm cách nào để lấy con trỏ đến dữ liệu của cấu trúc?
UPDATE:
tôi nhận nó làm việc sử dụng cơ bản y := reflect.New(reflect.TypeOf(x))
nên các giá trị của y
là settable bây giờ. Để biết ví dụ mở rộng, hãy xem điều này: https://gist.github.com/hvoecking/10772475
Ah, tôi hiểu rồi. Cách của tôi xung quanh vấn đề đó sẽ là (để hỗ trợ các cấu trúc tùy ý) để tạo một cá thể mới với sự trợ giúp của 'y: = reflect.New (reflect.TypeOf (x))' và sao chép tất cả các trường của 'x' vào các trường tương ứng của 'y'. – Heye
Cảm ơn Heye, bạn đã lưu tôi một giờ tìm kiếm khác. :) – Danyel
Điều đó có ý nghĩa hoàn hảo; nhưng lý do tại sao bạn không thể thay đổi một trường bên trong một giá trị động, ví dụ "x. (danh sách) .head = z" - vì điều này không tạo ra một con trỏ lơ lửng. – WPWoodJr