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

避免 Go 复制接口数据

避免 Go 复制接口数据

Go
LEATH 2021-09-27 21:29:03
这是我正在尝试编写的现实世界代码的一部分。问题是Go复制了接口sibling所以我不能修改数据。但是,如果我改为使用指向接口的指针,那么相等的概念就失败了。我知道我可以使用DeapEquals,但不能在地图中使用。package mainimport (    "fmt")type Q interface {    modify()}type P struct {    name    string    sibling Q}func (x P) modify() {    x.name = "a"}func main() {    a := P{"a", nil}    A := P{"?", nil}    b := P{"b", a}    B := P{"b", A}    B.sibling.modify()    fmt.Println(B)    fmt.Println(b == B)}如何让 Go 允许我修改接口数据本身而不复制它和修改副本?似乎这些在结构上是互斥的:我需要能够使用地图我需要能够使用方法修改接口数据
查看完整描述

2 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

修改数据而不复制数据的唯一方法是使用指针。


我对您所说的内容感到有些困惑,因为您的示例使用了结构并且您谈论了结构,但是您说您需要能够使用地图。无论哪种方式,DeepReflect 都适用于两者。这是您修改为使用指针的示例:


package main


import (

    "fmt"

    "reflect"

)


type Q interface {

    modify()

}


type P struct {

    name    string

    sibling Q

}


func (x *P) modify() {

    x.name = "a"

}


func main() {

    a := P{"a", nil}

    A := P{"?", nil}


    b := P{"b", &a}

    B := P{"b", &A}


    B.sibling.modify()


    fmt.Println("a:", a)

    fmt.Println("A:", A)

    fmt.Println("b:", b)

    fmt.Println("B:", B)

    fmt.Println(b == B)

    fmt.Println(reflect.DeepEqual(b, B))

}

印刷:


a: {a <nil>}

A: {a <nil>}

b: {b 0x10436180}

B: {b 0x10436190}

false

true

你可以看到这篇文章对地图做同样的事情。


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

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