美文网首页
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语言作用域小记

    下边代码为什么回报错,怎么改? 运行报以下错误: 14行,也就是fmt.Println(*a)报错了,因为13行输...

  • Go 语言变量作用域

    作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。Go 语言中变量可以在三个地方声明: ...

  • Go 语言变量作用域

    作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。 Go 语言中变量可以在三个地方声明:...

  • Go语言里面的变量作用域问题

    变量的作用域,通常有包package范围、函数func范围、或者闭包closure范围, go语言毕竟比C语言复杂...

  • 四、Go语言变量作用域

    四、Go语言变量作用域 全局变量 在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使...

  • Go语言的变量作用域

    参考:http://c.biancheng.net/view/4032.html 关键词 要明白,局部变量,形式参...

  • Go语言探索 - 8(原创)

    Go语言基础系列博客用到的所有示例代码 在上一篇文章主要学习了Go 语言变量以及变量的作用域。本篇文章主要学习的是...

  • 《Go语言四十二章经》第五章 作用域

    《Go语言四十二章经》第五章 作用域 作者:李骁 5.1 作用域 局部变量在函数体内或代码块内声明的变量称之为局部...

  • go作用域

    词法作用域 函数作用域类似闭包,因为x是全局变量 闭包: 他们之间有相似之处,因为在上面的代码中,x本来就是全局变...

  • Go 语言基础--函数&作用域

    访问标示 go变量通常会出现在函数内部(局部变量,只出现在函数体内,只能够在函数内部使用),函数外变量(全局变量,...

网友评论

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

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