首頁 >後端開發 >Golang >Go 指標:「&」(地址)和「*」(取消引用)之間有什麼區別?

Go 指標:「&」(地址)和「*」(取消引用)之間有什麼區別?

Susan Sarandon
Susan Sarandon原創
2024-12-02 18:59:09250瀏覽

Go Pointers: What's the Difference Between `&` (Address-of) and `*` (Dereference)?

& 和 * 指標

在 Go 中,將變數作為函數參數傳遞有時會引發編譯器錯誤,可以使用指標來解決。然而,& 和 * 指標之間的差異常常會導致混亂。本文旨在闡明兩種指標類型的差異和使用情境。

解決錯誤

在您的範例中,錯誤可能是由於預期參數類型與實際參數類型不匹配造成的變數通過。 Decode 函數需要一個指向 User 結構的位址或指針,但您直接傳遞該值。要解決這個問題,您可以使用 & 運算子來取得 User 變數的位址:

if err := decoder.Decode(&u); err != nil {
    http.Error(rw, "could not decode request", http.StatusBadRequest)
    return
}

理解指標

指標是保存其他變數位址的變數。 & 運算子傳回變數的位址,而 * 運算子允許我們存取該位址處的值。

在上面的範例中,&u 給出 User 結構體的位址,然後將其傳遞給解碼需要指標的函數。

但是,如果您使用以下方法建立了 User 實例:

u := new(User)

那麼您已經是一個指針,並且 & 運算子不是必需的。您也可以使用明確建立指標:

var u *User

& 和* 之間的差異

& 和* 之間的主要差異是* 表示重定向到儲存在位址中的值,而 &回傳位址

範例:

var y int
var pointerToY *int
var pointerToPointerToInt **int

y = 10
pointerToY = &y
pointerToPointerToInt = &pointerToY

現在:

  • y 的值為 10。
  • *pointerToY重定向到 y 並列印其值10.
  • &y回傳y的位址。
  • &pointerToY回傳pointerToY的位址。
  • &pointerToPointerToInt回傳pointerToPointerToInt的位址。
  • **pointerToPointerToInt列印值10,因為它重定向兩次以獲得to y.

使用場景

&(運算符位址) :

  • 傳遞變數的位址到一個函數。
  • 在分配給一個函數之前取得位址指標。
  • 比較兩個指標。

範例:

func swap(x, y *int) {
    *x, *y = *y, *x
}

*(解引用運算子):

    *(解引用運算子):
  • *(解引用運算子>訪問儲存在地址。
  • 為指標賦值。
比較兩個指標。

範例:
var p *int

*p = 10

結論:

理解 & 和 指針對於 Go 中有效的變數處理和解決編譯器錯誤至關重要。關鍵差異在於 的「重定向」行為,而 & 傳回變數的實際位址。透過仔細考慮預期的使用場景,您可以有效地利用 Go 程式碼中的指標來實現最佳效能和正確性。

以上是Go 指標:「&」(地址)和「*」(取消引用)之間有什麼區別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn