は私が持っているあなたが見ることができるように、変数のいくつかは、空のスライスであり、一部ではありませんhttps://play.golang.org/p/TlHCX29QZrフィールドをリフレクトを使用して構造体のスライスを変更するにはどうすればよいですか?
package main
import (
"fmt"
"reflect"
)
type A struct {
Name string
Age int
}
func change(a interface{}) {
aa := reflect.Indirect(reflect.ValueOf(a))
for i := 0; i < aa.NumField(); i++ {
field := aa.Field(i)
switch field.Interface().(type) {
case string:
field.Set(reflect.ValueOf("fred"))
case int:
field.Set(reflect.ValueOf(54))
default:
fmt.Println("unknown field")
}
}
}
func main() {
a := &A{"bob", 120}
b := []*A{}
c := []struct {
Alias string
Months int
}{}
d := []struct {
First string
Years int
}{
{"james", 22},
{"ricky", 32},
{"bobby", 12},
{"rachel", 82},
}
change(a)
fmt.Println(a) // want &A{"fred", 54}
change(b)
fmt.Println(b) // want []*A{&A{"fred", 54}}
change(c)
fmt.Println(c) // want []struct{struct{"fred", 54}}
change(d)
fmt.Println(d) // want []struct{struct{"fred", 54}, struct{"fred", 54}, struct{"fred", 54}, struct{"fred", 54}}
}
次。空の場合、{"fred"、54}の1つの構造体を追加する必要があります。空ではないスライスについては、すべての値を{"fred"、54}に変更する必要があります。私は、フィールドが何であるかを事前に知っていません...文字列フィールドがある場合、値は "fred"でintフィールドの場合54.
"a "それ以外のものはすべて"パニックに反映されません:リフレクションの呼び出し:Value.NumField on Slice Value "。私はこれについてどこに行くべきか分からない。ありがとうございました!
あなたは 'reflect.Kind's、structs、およびsliceの2つの異なるものを渡しています。スライスの場合は' NumField'を使うことができません。その内容を繰り返し処理しなければなりません。それらに 'NumField'を呼び出します。 – mkopriva
また、論理的には2つの異なることをしたいと思っています。 bとcでは、スライスが空の場合は1つの値を「追加」し、もう一方の場合は値を変更したいとします。 – JimB
@mkoprivaフィールド名を取得するために空の匿名構造体のスライスをどのように反復処理するのですか? –