我遇到的問題有很多限制,因此我將其大大簡化為包含以下內容的不自然代碼:
- 一個名為
Rect rA并且rB兩者都指向一個新Rect物件r1和r2,其中interfaces包含rA和rBr1Adr和r2Adr,其中包含和interfaces的地址rArB
我想rA = rB在不被允許參考rA或rB宣告我的變數之后做。
(注意:您會認為這很容易,并且您會這樣做*r1.(*Rect) = *r2.(*Rect)。但是,這種方法的問題是它不指向rARectrB物件-它只是將 Rect 的值克隆rB到rARect . 所以,我必須取消參考指向rA( r1Adr) 的指標并將其分配給它,rB以便rA指向與 相同的 Rect 物件rB。)
以下是我這樣做的嘗試:
type Rect struct {
width int
}
func main() {
rA := new(Rect)
rB := new(Rect)
var r1, r2, r1Adr, r2Adr any
r1 = rA
r2 = rB
r1Adr = &rA
r2Adr = &rB
*r1Adr.(**Rect) = *r2Adr.(**Rect)
// print the address of each Rect object being stored
fmt.Printf("%p, %p, %p, %p, %p, %p", rA, rB, r1, r2, *r1Adr.(**Rect), *r2Adr.(**Rect))
}
0xc00001c038, 0xc00001c038, 0xc00001c030, 0xc00001c038, 0xc00001c038, 0xc00001c038
游樂場:https ://go.dev/play/p/VnQwx6V7DNa
從輸出中可以看出,rA正確更新為rB,并且r1Adr完美r2Adr地反映了這一點。但是,r1'srA沒有更新到rB,我們知道這是因為它的輸出不同。為什么是這樣?如果rA正在更新到rB,并且如果r1存盤rA了,那么所rA指向的r1不更新到rB怎么辦?
任何關于我如何r1以這種方式進行初始化的見解(不從界面更改它)在完成后正確更新*r1Adr.(**Rect) = *r2Adr.(**Rect)將不勝感激。
uj5u.com熱心網友回復:
rA和rB是兩個指向不同物件的指標,A和B。
r1是指向 的介面A,r2是指向 的介面B。
r1Addr是一個指向&rA, and r2Addr is an interface pointing to&rB` 的介面。
因此,當您更新 的內容時r1Addr1,您rA指向rB.
但是,r1和r2仍然指向A和B。他們沒有改變。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516133.html
