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

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

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

Go
烙印99 2023-02-14 15:36:56
我想让两个接口引用相同的值(意味着如果你更新一个,另一个将更新为相同的东西):package mainimport (    "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)}打印日志HowdyHowdy游乐场: https://go.dev/play/p/qizVO42UaUja这段代码按预期工作,除了和b不是接口这一事实。所以当我将它们转换为这样的接口时......package mainimport (    "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)}打印日志HiHowdy游乐场: https://go.dev/play/p/jCpuepBJYdD...代码不再按预期工作。有没有办法在保持两个接口引用相同值的同时使用接口数据类型而不是 reflect.Value 数据类型?
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

简单的解决方案

想通了——不需要使用反射。在接口中存储值的地址将允许您通过对接口指针使用类型断言和取消引用来完成此操作:


package main


import "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))

}

打印日志


Howdy

Howdy

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


使用多个函数

如果您想抽象掉类型断言和取消引用:


package main


import "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))

}

打印日志


Howdy

Howdy

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


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

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