避免 Go 复制接口数据

这是我正在尝试编写的现实世界代码的一部分。问题是Go复制了接口sibling所以我不能修改数据。但是,如果我改为使用指向接口的指针,那么相等的概念就失败了。我知道我可以使用DeapEquals,但不能在地图中使用。


package main


import (

    "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 允许我修改接口数据本身而不复制它和修改副本?


似乎这些在结构上是互斥的:


我需要能够使用地图

我需要能够使用方法修改接口数据


LEATH
浏览 166回答 2
2回答

翻翻过去那场雪

修改数据而不复制数据的唯一方法是使用指针。我对您所说的内容感到有些困惑,因为您的示例使用了结构并且您谈论了结构,但是您说您需要能够使用地图。无论哪种方式,DeepReflect 都适用于两者。这是您修改为使用指针的示例:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "reflect")type Q interface {&nbsp; &nbsp; modify()}type P struct {&nbsp; &nbsp; name&nbsp; &nbsp; string&nbsp; &nbsp; sibling Q}func (x *P) modify() {&nbsp; &nbsp; x.name = "a"}func main() {&nbsp; &nbsp; a := P{"a", nil}&nbsp; &nbsp; A := P{"?", nil}&nbsp; &nbsp; b := P{"b", &a}&nbsp; &nbsp; B := P{"b", &A}&nbsp; &nbsp; B.sibling.modify()&nbsp; &nbsp; fmt.Println("a:", a)&nbsp; &nbsp; fmt.Println("A:", A)&nbsp; &nbsp; fmt.Println("b:", b)&nbsp; &nbsp; fmt.Println("B:", B)&nbsp; &nbsp; fmt.Println(b == B)&nbsp; &nbsp; fmt.Println(reflect.DeepEqual(b, B))}印刷:a: {a <nil>}A: {a <nil>}b: {b 0x10436180}B: {b 0x10436190}falsetrue你可以看到这篇文章对地图做同样的事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go