为了账号安全,请及时绑定邮箱和手机立即绑定

当 *string 值为 nil 时,如何将 *string 类型的值转换/分配为

当 *string 值为 nil 时,如何将 *string 类型的值转换/分配为

Go
大话西游666 2022-11-23 15:31:49

我正在尝试将 type 的值分配给 type*string的变量*wrapperspb.StringValue。但是,当*string为 nil 时,它会触发错误(请查看截取代码中的注释以了解是何种错误)。


这是我的代码的简化版本:


// You can edit this code!

// Click here and start typing.

package main


import (

    "fmt"


    "google.golang.org/protobuf/types/known/wrapperspb"

)


func main() {

    var var1 *wrapperspb.StringValue

    var1 = &wrapperspb.StringValue{Value: "test1"}

    fmt.Println("var1:")

    fmt.Println(var1)


    var var2 *string

    fmt.Println("var2:")

    fmt.Println(var2)


    //var1 = var2 // it says "Cannot use 'var2' (type *string) as the type *wrapperspb.StringValue"

    //var1 = wrapperspb.String(*var2) // it says panic: runtime error: invalid memory address or nil pointer dereference

    //fmt.Println("var1 with var2 value:")

    //fmt.Println(var1)

}

有谁知道如何正确处理转换/分配?


这是一个 golang 游乐场:https ://go.dev/play/p/5JBfU0oEIC-


查看完整描述

1 回答

?
不负相思意

TA贡献1473条经验 获得超10个赞

如果您的var2字符串指针是nil,您也应该保留var1 *wrapperspb.StringValue指针nil。wrapperspb.StringValue如果本身是nil指针,则句柄的方法。所以像这样“转换”它:


if var2 == nil {

    var1 = nil

} else {

    var1 = wrapperspb.String(*var2)

}

测试它:


for i := 0; i < 2; i++ {

    var var1 *wrapperspb.StringValue


    var var2 *string

    if i == 0 {

        s := "test"

        var2 = &s

    }


    if var2 == nil {

        var1 = nil

    } else {

        var1 = wrapperspb.String(*var2)

    }

    fmt.Printf("var2: %v\n", var2)

    fmt.Printf("var1: %v\n", var1)

    fmt.Printf("%q\n", var1.GetValue())

}

这将输出(在Go Playground上尝试):


var2: 0xc00009e470

var1: value:"test"

"test"

var2: <nil>

var1: <nil>

""


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信