使用反射设置一个字段的指针。

huangapple go评论84阅读模式
英文:

Set a pointer to a field using reflection

问题

我有以下的结构体,并且需要一些字段可以为null,所以我使用了指针,主要是为了处理SQL的null值。

type Chicken struct {
    Id                int         //不可为null
    Name              *string     //可以为null
    AvgMonthlyEggs    *float32    //可以为null
    BirthDate         *time.Time  //可以为null
}

当我执行以下操作时,我可以看到JSON结果中的值类型可以为null,这正是我想要的。

stringValue := "xx"
chicken := &Chicken{1, &stringValue, nil, nil}
chickenJson, _ := json.Marshal(&chicken)
fmt.Println(string(chickenJson))

但是当我尝试使用反射来完成所有操作时:

var chickenPtr *Chicken
itemTyp := reflect.TypeOf(chickenPtr).Elem()
item := reflect.New(itemTyp)
item.Elem().FieldByName("Id").SetInt(1)
//问题出在这里,不确定如何将指针设置给字段
item.Elem().FieldByName("Name").Set(&stringValue) //这一行引发了错误
itemJson, _ := json.Marshal(item.Interface())
fmt.Println(string(itemJson))

从反射部分得到的错误如下:

cannot use &stringValue (type *string) as type reflect.Value in argument to item.Elem().FieldByName("Name").Set

我做错了什么?

英文:

i have the following struct, and need some of the fields to be nulluble so i use pointers, mainly to handle sql nulls

type Chicken struct{
	Id                int         //Not nullable
	Name              *string     //can be null
	AvgMonthlyEggs    *float32    //can be null
	BirthDate         *time.Time  //can be null
}

so when i do the following i can see that the json result can have nulls for value types which is what i want

stringValue:="xx"
chicken := &Chicken{1,&stringValue,nil,nil}
chickenJson,_ := json.Marshal(&chicken)
fmt.Println(string(chickenJson))

but when i try to do it all using reflection

    var chickenPtr *Chicken
	itemTyp := reflect.TypeOf(chickenPtr).Elem()
	item  := reflect.New(itemTyp)
	item.Elem().FieldByName("Id").SetInt(1)
	//the problem is here not sure how to set the pointer to the field
	item.Elem().FieldByName("Name").Set(&stringValue) //Error caused by this line
	itemJson,_ := json.Marshal(item.Interface())
	fmt.Println(string(itemJson))

what i get from the reflection part is the following error

cannot use &stringValue (type *string) as type reflect.Value in argument to item.Elem().FieldByName("Name").Set

what am i doing wrong?

here is a GoPlay http://play.golang.org/p/0xt45uHoUn

答案1

得分: 3

reflect.Value.Set 只接受reflect.Value作为参数。在你的stringValue上使用reflect.ValueOf

item.Elem().FieldByName("Name").Set(reflect.ValueOf(&stringValue))

Playground: http://play.golang.org/p/DNxsbCsKZA.

英文:

reflect.Value.Set only accepts reflect.Value as an argument. Use reflect.ValueOf on your stringValue:

item.Elem().FieldByName("Name").Set(reflect.ValueOf(&stringValue))

Playground: http://play.golang.org/p/DNxsbCsKZA.

huangapple
  • 本文由 发表于 2014年7月22日 22:53:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/24890732.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定