【问题标题】:reflect.Value string not changing with SetString()reflect.Value 字符串不随 SetString() 改变
【发布时间】:2021-10-20 20:19:33
【问题描述】:

我在设置一个 reflect.Value 时遇到了一些麻烦,它是一个不同的字符串。

在关注GetValue() 时返回reflect.Value

val, err := exp.GetFact(t.(*api.Event_Set).Set.Key).GetValue()
if err != nil {
    ref := reflect.Indirect(val)
    ref.SetString(t.(*api.Event_Set).Set.Value)
}

点击 SetString 时会引发恐慌:

panic: reflect: reflect.Value.SetString using unaddressable value

我尝试了不同的语法,即不使用 Indirect,使用 Elem() 等。如何正确更改字符串的值?

【问题讨论】:

  • val的类型是什么?
  • 哦,是的,我上面提到了GetValue返回reflect.Value。包含的值是一个基本字符串。
  • 不,我们的意思是 val reflect.Value 中包含的值是什么?错误是你有一个不可寻址的值,你不能在事后使它成为可寻址的。
  • 如果只是string 而不是*string,我认为这将是您问题的根源。
  • 如果您提供对相关库的引用,那么我们可以提供更具体的答案(通过查看源代码)。一般来说,如果给reflect.Value 的值不是以指针开头的,则没有有意义的方法将其转换为指针,因为与原始“真实”值的所有关联都已丢失。 (顺便说一句,试试val.Type().String()

标签: go


【解决方案1】:

我可能没有完整的代码,但类似这样的工作:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    s := "test"
    value := reflect.ValueOf(&s)
    ref := reflect.Indirect(value)
    ref.Set(reflect.ValueOf("test1"))
    fmt.Printf(s)
}

【讨论】:

    【解决方案2】:

    我看到了类似的东西,使用的是最后一个回答者的代码。

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        s := "test"
        ref := reflect.ValueOf(&s).Elem()
        ref.Set(reflect.ValueOf("test1"))
        fmt.Printf(s)
    }
    

    【讨论】:

    • 您可以添加有关此功能如何提供帮助的更多信息。此外,您可以解释其他答案的代码与您的代码之间的差异,以帮助社区。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多