3 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
對(duì)不起,我發(fā)現(xiàn)我做錯(cuò)了,我tempV錯(cuò)了
func toStrings(slice interface{}) [][]string {
switch reflect.TypeOf(slice).Elem().Kind() {
case reflect.Slice:
ret := [][]string{}
val := reflect.ValueOf(slice).Elem()
for i := 0; i < val.Len(); i++ {
tempSlice := []string{}
// tempV should be:
tempV := val.Index(i)
// instead of reflect.ValueOf(val.Index(i))
for j := 0; j < tempV.NumField(); j++ {
tempSlice = append(tempSlice, tempV.Field(j).String())
}
ret = append(ret, tempSlice)
}
return ret
}
return nil
}

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
也許我有一個(gè)簡(jiǎn)單的方法來解決問題,golang playground here
我曾經(jīng)encoding/json轉(zhuǎn)換為json數(shù)據(jù),然后將其轉(zhuǎn)換為map[string]interface{}。
func toStrings2(slice interface{}) [][]string {
jsonData, _ := json.Marshal(slice)
var out []map[string]interface{}
_ = json.Unmarshal(jsonData, &out)
var fields []string
if len(out) > 0 {
for k := range out[0] {
fields = append(fields, k)
}
}
var ret [][]string
for _, row := range out {
var r []string
for _, k := range fields {
r = append(r, fmt.Sprint(row[k]))
}
ret = append(ret, r)
}
return ret
}
注意:
在@CeriseLimón 的幫助下,我知道此答案中的代碼無法處理 User.ID 的大值。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
問題中的代碼有兩個(gè)問題。第一個(gè)問題是 slice 元素被表達(dá)式中的 aa reflect.Value 雙重包裹reflect.Value(val.Index(i))。通過刪除對(duì) reflect.Value 的額外調(diào)用來修復(fù)。第二個(gè)問題是reflect.Value String方法不會(huì)將基礎(chǔ)值轉(zhuǎn)換為其字符串表示形式。使用 fmt.Sprint(或其朋友之一)來做到這一點(diǎn)。
試試這個(gè):
func toStrings(slice interface{}) [][]string {
// Get reflect value for slice. Use Indirect to
// handle slice argument and pointer to slice
// argument.
v := reflect.Indirect(reflect.ValueOf(slice))
if v.Kind() != reflect.Slice {
return nil
}
var result [][]string
// For each element...
for i := 0; i < v.Len(); i++ {
// Get reflect value for slice element (a struct). Use
// Indirect to handle slice of struct and slice of
// pointer to struct.
e := reflect.Indirect(v.Index(i))
if e.Kind() != reflect.Struct {
return nil
}
// Convert fields to string and append.
var element []string
for i := 0; i < e.NumField(); i++ {
// Use fmt.Sprint to convert arbitrary Go value
// to a string.
element = append(element, fmt.Sprint(e.Field(i).Interface()))
}
result = append(result, element)
}
return result
}
- 3 回答
- 0 關(guān)注
- 180 瀏覽
添加回答
舉報(bào)