go语言作用域小记

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容