第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

具有接口成員和指針接收器的結(jié)構(gòu)

具有接口成員和指針接收器的結(jié)構(gòu)

Go
翻閱古今 2022-05-05 16:04:10
我正在創(chuàng)建一個(gè)簡(jiǎn)單的排序二叉樹(shù),它是不可變的(它應(yīng)該表現(xiàn)得像它的不可變),并且我不確定指針接收器在傳遞帶有接口的結(jié)構(gòu)時(shí)如何工作。這是我定義二叉樹(shù)的方式。type btree interface {    display(io.Writer)    add(int) btree    replace(int, int)//A test to see if we are sharing nodes}二叉樹(shù)節(jié)點(diǎn)定義如下:type node struct {    data  int    left  btree    right btree}和空的二叉樹(shù)節(jié)點(diǎn)type empty struct{}功能與方法func createEmpty() btree {    return &empty{}}節(jié)點(diǎn)結(jié)構(gòu)的方法//replace is just a test to see if I'm sharing nodesfunc (n *node) replace(value, replacement int) {    if n.data < value {        n.left.replace(value, replacement)    } else if n.data > value {        n.right.replace(value, replacement)    } else {        n.data = replacement    }}func (n *node) add(data int) btree {    if n.data < data {        l := &node{n.data, n.left.add(data), n.right}        return l    } else if n.data > data {        r := &node{n.data, n.left, n.right.add(data)}        return r    } else {        return n    }}func (n *node) display(w io.Writer) {    n.left.display(w)    fmt.Fprintln(w, n.data)    n.right.display(w)}空節(jié)點(diǎn)的方法//replace is just a test to see if I'm sharing nodesfunc (*empty) replace(_, _ int) {}func (e *empty) add(data int) btree {    en := &node{data, e, e}    return en}func (*empty) display(w io.Writer) {    fmt.Fprintln(w, "Empty")}請(qǐng)注意,代碼確實(shí)按預(yù)期工作,但我不確定當(dāng)我將帶有接口成員的結(jié)構(gòu)傳遞給指針接收器時(shí)會(huì)發(fā)生什么。接口數(shù)據(jù)結(jié)構(gòu)是否被復(fù)制,但只是一個(gè)淺拷貝,所以它指向的數(shù)據(jù)保持不變?在這種情況下,是否有關(guān)于接口會(huì)發(fā)生什么的文檔?
查看完整描述

1 回答

?
皈依舞

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊

鑒于這種結(jié)構(gòu):


type node struct {

    data  int

    left  btree

    right btree

}

以及f帶有 q 指針接收器的函數(shù):


func (n *node) f() {}

f獲得指向 a 的指針node。f對(duì)節(jié)點(diǎn)所做的任何更改n都將反映在用于調(diào)用的副本上f。


更準(zhǔn)確地說(shuō),當(dāng)您調(diào)用n.f()并且 ifn是 a*node時(shí),該指針的副本被發(fā)送到f,它仍然指向與 相同的對(duì)象n。如果n不是指針,&n則將發(fā)送到f.


為了使您的代碼正常工作,左右btree接口還應(yīng)該包含*nodes,而不是nodes(您已經(jīng)正確地這樣做了)。這是因?yàn)椋?,如果您調(diào)用 ,node.left.replace您希望node.left替換 中的值。如果您有一個(gè)replace函數(shù)的值接收器,那么當(dāng)您調(diào)用node.left.replace該左側(cè)節(jié)點(diǎn)的副本時(shí),將作為接收器將其發(fā)送到函數(shù),并且修改在節(jié)點(diǎn)replace上不可見(jiàn)。node.left


希望這可以幫助。


查看完整回答
反對(duì) 回復(fù) 2022-05-05
  • 1 回答
  • 0 關(guān)注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)