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

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

go中的“不能分配給取消引用”是什么意思?

go中的“不能分配給取消引用”是什么意思?

Go
小唯快跑啊 2022-07-04 16:35:51
我正在學習圍棋,直到我在書中看到它之前,我對“指針”一無所知。這是我的代碼:var num int = 1var numPtr4 *int = &num *numPtr4 = num&num = numPtr4 // Error occur: cannot assign to &numfmt.Println( num, &num, numPtr4, *numPtr4)我試圖將指針變量(numPtr4)分配給num的內存地址(使用&),但它失敗了。我錯過了什么?和,var c Circlevar c1 *Circlec1 = new(Circle) c2 := new(Circle) fmt.Println(c, c1, c2) // {0 0 0} &{0 0 0} &{0 0 0}我猜 c1 和 c2 是指針變量,但它們返回它們的初始化值而不是它們的地址。為什么他們不返回地址?
查看完整描述

4 回答

?
www說

TA貢獻1775條經驗 獲得超8個贊

在第一種情況下,num 是具有分配內存位置的 int 類型。Golang 不允許您編輯該變量的內存地址。這不是一個可以為語言提供太多價值的功能。

在第二種情況下,golang 試圖假設您想要什么,即打印數據,無論它是否是指針。在標準情況下,這是正確的選擇。除非在這種情況下,當您學習指針時,知道內存位置對您沒有什么幫助。

要打印內存位置,請使用 %p


查看完整回答
反對 回復 2022-07-04
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

在您的示例代碼numPtr4 = num中也失敗了,所以我收到兩個錯誤(操場):。

./prog.go:10:10: cannot use num (type int) as type *int in assignment
./prog.go:11:7: cannot assign to &num

我認為第一個錯誤是不言自明的;var numPtr4 *int = &num創建一個變量numPtr4,它是指向int. 然后你不能分配一個int。請注意,一種更簡單的創建方法numPtr4(具有相同的結果)是numPtr4 := &num.

第二個錯誤(cannot assign to &num)是您要詢問的錯誤;讓我們看看是什么#從go 規范

對于 T 類型的操作數 x,地址操作 &x 生成 *T 類型的指向 x 的指針。. 操作數必須是可尋址的,即變量、指針間接或切片索引操作;或可尋址結構操作數的字段選擇器;或可尋址數組的數組索引操作。

因此&num導致指向num. 您的聲明似乎試圖創建一個指向num&num) 的指針并為其分配一個值(這沒有意義,因為結果會丟失)。Go 規范中關于assignments的部分禁止這種事情:

每個左側操作數必須是可尋址的、映射索引表達式或(僅用于 = 分配)空白標識符。操作數可以用括號括起來。

有關 addressable 的定義,請參見前面的引用。

您可以實現您想要的num = *numPtr4(但是歸結為num = num它在這種情況下沒有多大意義)。

參考fmt.Println(c, c1, c2) // {0 0 0} &{0 0 0} &{0 0 0};Println的文檔指出:

Println 使用其操作數的默認格式格式化并寫入標準輸出。

有關格式的信息,請參閱此部分- 相關部分標題以“對于復合對象...”開頭。當輸出一個指針時,你最想看到的是它所指向的東西(這是默認給你的)。正如其他人所指出的,您可以將值作為地址輸出fmt.Printf("%p",c1)。


查看完整回答
反對 回復 2022-07-04
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

num 不是指針,您可以以這種方式寫入內存,因此重構您的代碼(* 表示取消引用(setter)& 表示引用(getter)), *將采用內存地址(&varname)&varname 表示它應該在哪里像這樣


var num *int

var numPtr4 *int 

numPtr4 = num

num = numPtr4 // Error occur: cannot assign to &num

fmt.Println( num, &num, numPtr4, *numPtr4)


查看完整回答
反對 回復 2022-07-04
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

使用fmt.Printf的格式化動詞%p來呈現內存地址:

fmt.Printf("%v %p %p\n", c, c1, c2)


查看完整回答
反對 回復 2022-07-04
  • 4 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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