Golang set nil string pointer value in struct using reflect
go, null, pointers, reflection, struct
Solution
You first need a pointer to a `Person{}`, because you need to set a value to the `LastName` Field.
p := &Person{}
Then you can set a valid pointer value to the `LastName` field, which will allow you to set the string value:
rp.Field(1).Set(reflect.New(rp.Field(1).Type().Elem()))
rp.Field(1).Elem().SetString("Jones")
https://play.golang.org/p/f5MjpkDI2H
Problem
Using Go's reflect package, is there a way to set a pointer in a struct if the pointer is nil? Looking at the reflect package, if `reflect.Value.CanSet()` is `false` then any `Set()` calls will yield a panic. Is there another way around this, only using the reflect package, not depending on any direct reference to the struct? For example, how can I set the empty last name as "Johnson" in the code below? ``` package main import ( "fmt" "reflect" ) type Person struct { FirstName *string LastName *string } func main() { p := Person{} firstName := "Ryan" p.FirstName = &firstName rp := reflect.ValueOf(p) fmt.Println("rp:", rp) for i := 0; i < rp.NumField(); i++ { fmt.Printf("%s: Pointer: %d CanSet: %t\n", rp.Type().Field(i).Name, rp.Field(i).Pointer(), rp.Field(i).Elem().CanSet()) } rp.Field(0).Elem().SetString("Brian") fmt.Println(*p.FirstName) // Yields nil pointer error // rp.Field(1).Elem().SetString("Johnson") // fmt.Println(*p.LastName) fmt.Println(rp.Field(1).Type()) fmt.Println(rp.Field(1).CanSet()) // fmt.Println(rp.Field(1).Elem().Type()) // nil pointer here also fmt.Println(rp.Field(1).Elem().CanSet()) } ``` See in Golang Playground