美文网首页
go语言作用域小记

go语言作用域小记

作者: ashin_l | 来源:发表于2018-11-13 09:42 被阅读0次

    下边代码为什么回报错,怎么改?

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var a *int                                // (1)
        if true {
            a, err := generate()                  // (2)
            fmt.Println(*a, err)
        }
        fmt.Println(a)
        fmt.Println(*a)
    }
    
    func generate() (*int, error) {
        a := 3
        return &a, nil
    }
    

    运行报以下错误:

    3 <nil>
    <nil>
    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x484a97]
    
    goroutine 1 [running]:
    main.main()
            /home/ashin/go/src/github.com/ashin-l/go-exercise/wso2iot/streammedia/test.go:14 +0xd7
    exit status 2
    

    14行,也就是fmt.Println(*a)报错了,因为13行输出<nil>a没有初始化。这是因为在if true代码块中a, err := generate(),我们使用:=,默认创建了新的变量a,他只在此代码快中有效,所以(1)处的a并没有初始化。要在if true代码块中初始化(1)处的a,我们需要做以下修改:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var a *int
        if true {
            var err error
            a, err = generate()
            fmt.Println(*a, err)
        }
        fmt.Println(a)
        fmt.Println(*a)
    }
    
    func generate() (*int, error) {
        a := 3
        return &a, nil
    }
    

    运行输出:

    3 <nil>
    0xc0000ae000
    3
    

    一切ok

    相关文章

      网友评论

          本文标题:go语言作用域小记

          本文链接:https://www.haomeiwen.com/subject/lvhkfqtx.html