簡體   English   中英

使用Go中的reflect設置切片索引

[英]Set slice index using reflect in Go

我在Go中,使用一個切片的reflect.Value表示。 我有以下內容:

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

如果我想從slice獲得第i個值,那很簡單:

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

the ith value. 但是,我似乎找不到第i個值的方法。 reflect.Value有很多setter方法,例如,如果我有一個map, m ,以下是可能的:

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

但似乎沒有相應的切片。 我的一個想法是,也許從slice.Index(i)返回的值實際上是一個指針,所以調用v := slice.Index(i); v.Set(newV) v := slice.Index(i); v.Set(newV)會起作用嗎? 我不確定。 想法?

弄清楚了! 事實證明我過早地發布了這個 - 我的猜測slice.Index(0)返回一個指針是正確的。 特別是:

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())

打印:

0
1
1

(這里是go操場上的可運行代碼

這可能有所幫助:

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

我從一個庫中取了一段時間后寫了github.com/webconnex/xmlutil ,特別是decode.go。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM