2013-08-07 33 views
7

Tôi đang ở chế độ Bắt đầu, làm việc với biểu diễn phản chiếu.Giá trị của một lát. Tôi có những điều sau đây:Đặt chỉ mục lát bằng cách sử dụng phản ánh trong Go

slice := reflect.MakeSlice(typ, len, cap) 

Nếu tôi muốn có được giá trị thứ i từ slice, nó đơn giản:

v := slice.Index(i) // returns a reflect.Value 

Tuy nhiên, tôi dường như không thể tìm thấy một cách để thiết thứ i giá trị. reflect.Value có rất nhiều phương pháp setter, ví dụ, nếu tôi đã có một bản đồ, m, sau đây là có thể:

m.SetMapIndex(key, value) // key and value have type reflect.Value 

Nhưng có vẻ không phải là một tương đương cho lát. Một suy nghĩ của tôi là có lẽ giá trị trả lại từ slice.Index(i) thực sự là một con trỏ bằng cách nào đó, do đó, gọi v := slice.Index(i); v.Set(newV) sẽ hoạt động? Tôi không chắc. Ý tưởng?

Trả lời

13

Đã tìm ra! Hóa ra tôi đã đăng bài này sớm - tôi đoán rằng slice.Index(0) trả về một con trỏ là chính xác. Đặc biệt:

one := reflect.ValueOf(int(1)) 

slice := reflect.MakeSlice(reflect.TypeOf([]int{}), 1, 1) 
v := slice.Index(0) 
fmt.Println(v.Interface()) 

v.Set(one) 
fmt.Println(v.Interface()) 

v = slice.Index(0) 
fmt.Println(v.Interface()) 

in:

0 
1 
1 

(Dưới đây là runnable code trên sân chơi đi)

0

này có thể giúp:

n := val.Len() 
if n >= val.Cap() { 
    ncap := 2 * n 
    if ncap < 4 { 
     ncap = 4 
    } 
    nval := reflect.MakeSlice(val.Type(), n, ncap) 
    reflect.Copy(nval, val) 
    val.Set(nval) 
} 
val.SetLen(n + 1) 
// ... 
val.Index(n).SetString("value") // Depends on type 

Taken từ một thư viện tôi đã viết một khi trở lại github.com/webconnex/xmlutil, cụ thể decode.go.

+0

Hey, cảm ơn. Tôi đã tìm ra nó tho (loại nhảy súng khi đăng một câu hỏi: D). – joshlf

+0

@ joshlf13 Tôi nhận thấy bạn đã hỏi một số câu hỏi 'phản ánh'. Kiểm tra 'xmlutil' được liên kết ở trên, cũng như một số gói mã hóa khác. Họ nên giúp đỡ khá nhiều. – Luke

+0

Ok, sẽ làm. btw, nếu bạn quan tâm, lý do tôi đang sử dụng phản ánh rất nhiều là tôi đang viết một gói có tên "bất hợp pháp" cung cấp các chức năng để thực hiện các hành động không được phép kỹ thuật (như chức năng Bản đồ chung, so sánh hai con trỏ hàm, v.v.) Đó là một repo tư nhân trên github tại thời điểm này (chưa sẵn sàng cho sản xuất nào được nêu ra), nhưng nếu bạn có bất kỳ quan tâm đến việc đóng góp, tôi rất vui khi được giúp đỡ về nó. – joshlf

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