Go指針容易犯的錯誤

package main

import "fmt"

type Student struct {
    name string
}

func main() {
    var students [2]Student
    students[0].name = "fred"
    students[1].name = "karen"

    var fredPtr *Student
    fredPtr = nil

    for _, student := range students {
        if student.name == "fred" {
            fredPtr = &student
        }
    }

    fmt.Println(fredPtr.name)
}

這段代碼的輸出結果是:

go run for-loop.go
karen

因為 fredPtr 在賦值的時候指向的是student變量,當第一次迭代時,指向fred,但是當第二次迭代時,則會指向karen,這是就會到時結果和預期不一致。

圖片表示如下:

第一次迭代.png
第二次迭代.png

正確的寫法

package main

import "fmt"

type Student struct {
    name string
}

func main() {
    var students [2]Student
    students[0].name = "fred"
    students[1].name = "karen"

    var fredPtr *Student
    fredPtr = nil

    for idx, student := range students {
        if student.name == "fred" {
          fredPtr = &students[idx]
        }
    }

    fmt.Println(fredPtr.name)
}

參考原文:Go is Not Python

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容