4 回答

TA貢獻1775條經驗 獲得超8個贊
在第一種情況下,num 是具有分配內存位置的 int 類型。Golang 不允許您編輯該變量的內存地址。這不是一個可以為語言提供太多價值的功能。
在第二種情況下,golang 試圖假設您想要什么,即打印數據,無論它是否是指針。在標準情況下,這是正確的選擇。除非在這種情況下,當您學習指針時,知道內存位置對您沒有什么幫助。
要打印內存位置,請使用 %p

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
)是您要詢問的錯誤;讓我們看看是什么&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)
。

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)
- 4 回答
- 0 關注
- 180 瀏覽
添加回答
舉報