下边代码为什么回报错,怎么改?
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
网友评论