Pointers Golang使用reflect在struct中设置nil字符串指针值

Pointers Golang使用reflect在struct中设置nil字符串指针值,pointers,go,reflection,struct,null,Pointers,Go,Reflection,Struct,Null,使用Go的reflect包,如果指针为nil,是否有方法在结构中设置指针?查看reflect包,如果reflect.Value.CanSet()为false,则任何Set()调用都会产生恐慌。有没有其他方法可以解决这个问题,只使用reflect包,而不依赖于对struct的任何直接引用?例如,如何在下面的代码中将空姓氏设置为“Johnson” package main import ( "fmt" "reflect" ) type Person struct { Fi

使用Go的reflect包,如果指针为nil,是否有方法在结构中设置指针?查看reflect包,如果
reflect.Value.CanSet()
false
,则任何
Set()
调用都会产生恐慌。有没有其他方法可以解决这个问题,只使用reflect包,而不依赖于对struct的任何直接引用?例如,如何在下面的代码中将空姓氏设置为“Johnson”

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())
}
主程序包
进口(
“fmt”
“反映”
)
类型Person结构{
名字*字符串
LastName*字符串
}
func main(){
p:=人{}
名字:=“Ryan”
p、 FirstName=&FirstName
rp:=反射值(p)
fmt.Println(“rp:,rp)
对于i:=0;i

首先需要指向
人员{}
的指针,因为需要为
LastName
字段设置一个值

p := &Person{}
然后,您可以设置一个指向
LastName
字段的有效指针值,这将允许您设置字符串值:

rp.Field(1).Set(reflect.New(rp.Field(1).Type().Elem()))
rp.Field(1).Elem().SetString("Jones")

我要问一个显而易见的问题。。。你为什么要这么做?我自己从来没有看到过使用字符串指针的理由,也没有看到在标准库中使用它们。这是一个公平的问题。当我公开一个RESTAPI时,这是我了解客户机是否提供了字段的方式。如果它们不是指针,则字符串的空值为“
。那我得问问。。客户是否提供了
,还是什么也没有提供?另外,我正在向结构字段添加唯一的标记,如<代码>验证
转换
。因此,我使用那里的reflect包来解析这些。