首頁 > 後端開發 > Golang > 為什麼 Go 的「fmt.Printf」輸出在列印結構體指標和映射值指標時會不同?

為什麼 Go 的「fmt.Printf」輸出在列印結構體指標和映射值指標時會不同?

Linda Hamilton
發布: 2024-12-03 16:54:11
原創
544 人瀏覽過

Why do Go's `fmt.Printf` outputs differ when printing pointers to structs and pointers to map values?

Go 中的指標:了解Printf 格式

在Go 中,指標在透過引用傳遞變數方面發揮著至關重要的作用。但是,它們的使用有時會導致意外結果,如提供的程式碼範例中所示。讓我們深入研究細節並解決差異。

問題:

程式碼嘗試列印兩個變量,一個是指向 Test 結構體 (&test1) 的指針,另一個是指向 Test 結構體的指針。另一個是來自地圖的值(&test2)。列印這些值時會出現問題,因為它們會產生不同的輸出。

解釋:

理解差異的關鍵在於 fmt.Printf 函數。此函數採用格式字串和可變數量的介面{}類型的參數。當傳遞的值不是interface{}類型時,它會自動包裝在interface{}值中。

在第一種情況下,&test1是*Test類型,當傳遞給fmt.Printf時,它被包裝在一個 interface{} 值中。指標的預設格式是 %p,它會列印值的十六進位位址。因此,輸出為“0xc00009e190”。

相反,&test2 的型別為 *interface{}。當傳遞給 fmt.Printf 時,它被包裝在另一個 interface{} 值。 interface{} 值的預設格式為 %v,並根據基礎類型而變化。在這種情況下,底層類型是指向interface{}的指針,指針的%v格式是%p。因此,輸出也是一個十六進位位址,但是對於 *interface{} 值的位址,因此為「0xc00029c0a0」。

解:

取得來自 test2 的結構體值,可以使用型別斷言。這實質上假設 test2 中儲存的值是一個 Test 結構,並對其進行適當的轉換。

test2 := Models["test"].(Test)
登入後複製

透過此修改,test2 將是 Test 類型,並且當傳遞給 fmt.Printf 時,它將產生與 &test1 的輸出相同。

最佳實踐:

通常是建議直接在映射中儲存 *Test 值,以避免需要類型斷言或中間變數聲明。這確保了儲存在映射中的介面值已經是指向 Test 的指針,可以原樣使用和傳遞。

以上是為什麼 Go 的「fmt.Printf」輸出在列印結構體指標和映射值指標時會不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板