当 *string 值为 nil 时,如何将类型为 *string 的值 convert/assign 键入 *wrapperspb.StringValue?

How to convert/assign a value with type *string to type *wrapperspb.StringValue when the *string value is nil?

我正在尝试将类型为 *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)
}

有谁知道如何正确处理conversion/assignment?

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

如果您的 var2 字符串指针是 nil,您也应该保留 var1 *wrapperspb.StringValue 指针 nilwrapperspb.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>
""