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

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

請解釋 &, 和 * 指針

請解釋 &, 和 * 指針

Go
慕斯709654 2021-11-08 19:15:54
當我嘗試在 Go 函數中將變量作為參數傳遞時,編譯器在多個實例中拋出錯誤。有時我已經能夠通過在變量前面使用指針來調試它。& 和 * 指針似乎都清除了錯誤。不過,我想知道為什么。我想知道 & 和 * 之間的區別是什么,以及何時應該使用它們。謝謝!func (ctx *NewContext) SendNotification(rw http.ResponseWriter, req *http.Request, p httprouter.Params) {    decoder := json.NewDecoder(req.Body)    var u User    if err := decoder.Decode(&u); err != nil {        http.Error(rw, "could not decode request", http.StatusBadRequest)        return    }}
查看完整描述

3 回答

?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

在上面的示例中,您將 u 定義為 User 類型,但不是指向 User 的指針。所以你需要 &u 是因為 json 包中的 Decode 函數需要一個地址或指針。


如果您像這樣創建 User 的實例: u := new(User) 它將是一個指針,因為 new 函數返回一個指針。你也可以像這樣創建一個指向用戶的指針:var u *User。如果您執行了其中任何一項操作,則必須&在對 Decode 的調用中刪除才能使其工作。


指針基本上是保存地址的變量。當您將 & 放在變量前面時,它會返回地址。* 可以讀作'redirect of'。因此,當您創建這樣的指針時:


var x *int


這可以理解為 x 將重定向到一個 int。當你給 x 賦值時,你會給它一個這樣的地址: y := 10 x = &y


其中 y 是一些整數。因此,如果您要打印 x,您將獲得 y 的地址,但是如果您打印 *x,您將重定向到 x 指向的 y 值是 10。如果您要打印 &x,您將獲得指針 x 本身的地址。


如果你試圖打印出 *y,它只是一個 int,而不是一個指針,它會拋出一個錯誤,因為你將使用一些不是要重定向到的地址的值進行重定向。


運行下面的一些指針樂趣:


package main


import "fmt"


func main() {

    var y int

    var pointerToY *int

    var pointerToPointerToInt **int


    y = 10

    pointerToY = &y

    pointerToPointerToInt = &pointerToY


    fmt.Println("y: ", y)

    fmt.Println("pointerToY: ", pointerToY)

    fmt.Println("pointerToPointerToInt: ", pointerToPointerToInt)


    fmt.Println("&y: ", &y)     // address of y

    fmt.Println("&pointerToY: ", &pointerToY)// address of pointerToY

    fmt.Println("&pointerToPointerToInt: ", &pointerToPointerToInt) // address of pointerToPointerToInt


    // fmt.Println(*y) throws an error because 

    // you can't redirect without an address.. 

    // y only has int value of 10

    fmt.Println("*pointerToY: ", *pointerToY) // gives the value of y

    fmt.Println("*pointerToPointerToInt: ", *pointerToPointerToInt)     // gives the value of pointerToY which is the address of y


    fmt.Println("**pointerToPointerToInt: ", **pointerToPointerToInt)    // this gives 10, because we are redirecting twice to get y


    if pointerToY == *pointerToPointerToInt {

        fmt.Println("'pointerToY == *pointerToPointerToInt' are the same!")

    }


    if pointerToY == &y {

        fmt.Println("'pointerToY == &y' are the same!")

    }


    if &pointerToY == pointerToPointerToInt {

        fmt.Println("'&pointerToY == pointerToPointerToInt' are the same!")

    }


    if y == **pointerToPointerToInt {

        fmt.Println("'y == **pointerToPointerToInt' are the same!")

    }


    if pointerToY == *pointerToPointerToInt {

        fmt.Println("'pointerToY == *pointerToPointerToInt' are the same!")

    }


}

希望這可以幫助!


查看完整回答
反對 回復 2021-11-08
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

我會引用一位聰明的家伙的話:

變量名前面的 & 用于檢索該變量值的存儲地址。該地址是指針將要存儲的地址。

* 在類型名稱之前,表示聲明的變量將存儲該類型的另一個變量的地址(不是該類型的值)。

* 在指針類型的變量前面用于檢索存儲在給定地址的值。在 Go 語言中,這稱為取消引用。

來源:http : //piotrzurek.net/2013/09/20/pointers-in-go.html


查看完整回答
反對 回復 2021-11-08
?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

顯示代碼執行順序的簡單示例。


   import (

        "fmt"

    )


    func main() {

        x := 0

        fmt.Println("Step 1", x)

        foo(&x)

        fmt.Println("Step 4", x)

    }


    func foo(y *int) {


        fmt.Println("Step 2", *y)

        *y = 100

        fmt.Println("Step 3", *y)

    }

/*

 Steps  Result

   1      0

   2      0

   3      100

   4      100

 */


查看完整回答
反對 回復 2021-11-08
  • 3 回答
  • 0 關注
  • 242 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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