如何让多个接口引用同一个值?

我想让两个接口引用相同的值(意味着如果你更新一个,另一个将更新为相同的东西):


package main


import (

    "fmt"

    "reflect"

)


func main(){

    var a, b any


    a = "Hi"


    b = reflect.ValueOf(&a).Elem()

    a = reflect.ValueOf(&b).Elem()


    b = "Howdy"


    fmt.Println(a)

    fmt.Println(b)

}

打印日志


Howdy

Howdy

游乐场: https://go.dev/play/p/qizVO42UaUj


a这段代码按预期工作,除了和b不是接口这一事实。所以当我将它们转换为这样的接口时......


package main


import (

    "fmt"

    "reflect"

)


func main(){

    var a, b any


    a = "Hi"


    b = reflect.ValueOf(&a).Elem().Interface()

    a = reflect.ValueOf(&b).Elem().Interface()


    b = "Howdy"


    fmt.Println(a)

    fmt.Println(b)

}

打印日志


Hi

Howdy

游乐场: https://go.dev/play/p/jCpuepBJYdD


...代码不再按预期工作。


有没有办法在保持两个接口引用相同值的同时使用接口数据类型而不是 reflect.Value 数据类型?


烙印99
浏览 79回答 1
1回答

芜湖不芜

简单的解决方案想通了——不需要使用反射。在接口中存储值的地址将允许您通过对接口指针使用类型断言和取消引用来完成此操作:package mainimport "fmt"func main() {    var object any    object = "Hi"    var a, b any    a = &object    b = &object    *a.(*any) = "Howdy"    fmt.Println(*a.(*any))    fmt.Println(*b.(*any))}打印日志HowdyHowdy游乐场: https://go.dev/play/p/LEx8MR4ZK06使用多个函数如果您想抽象掉类型断言和取消引用:package mainimport "fmt"func getStuff(a any) any {    return *a.(*any)}func setStuff(a, to any) {    *a.(*any) = to}func main() {    var object any    object = "Hi"    var a, b any    a = &object    b = &object    setStuff(a, "Howdy")    fmt.Println(getStuff(a))    fmt.Println(getStuff(b))}打印日志HowdyHowdy游乐场: https://go.dev/play/p/RUX4cu2Cx2o
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go