亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

避免 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 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號