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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容