如何解决从标准输入读取时,Nil指针取消引用行为
这是我的Go程序:
package main
import (
"bufio"
"flag"
. "fmt"
"os"
)
var (
testBool *bool
myName *string
)
func main() {
testBool = flag.Bool("testbool",false,"test bool flag")
flag.Parse()
Println(*testBool)
funcFlags()
}
func funcFlags() {
reader := bufio.NewReader(os.Stdin)
Print("Enter your name: ")
*myName,_ = reader.ReadString('\n')
Println(myName)
}
其执行最终以nil指针取消引用错误结束,如下所示:
▶ go run main.go -testbool
true
Enter you name: John
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x10acc9e]
goroutine 1 [running]:
main.funcFlags()
/Users/pantelis/Desktop/cli_testing/main.go:25 +0x1de
main.main()
/Users/pantelis/Desktop/cli_testing/main.go:19 +0x13b
exit status 2
为什么要分配
*myName,_ = reader.ReadString('\n')
testBool = flag.Bool("testbool","test bool flag")
成功。
两个变量(即testBool
和myName
)的初始化方式相同。
解决方法
此行:
*myName,_ = reader.ReadString('\n')
表示将值分配给myName
指针所指向的位置。但是它没有指向任何地方,其值为nil
。您无法取消引用nil
指针,这是您遇到的运行时恐慌。
testBool
的不是初始化方式相同。
testBool = flag.Bool("testbool",false,"test bool flag")
这里testBool
未取消引用,flag.Bool()
返回一个非nil
指针,该指针分配给testBool
变量,而非分配给指示值。
要使您的应用正常运行,myName
必须指向某个地方。您必须对其进行初始化,例如内置的new()
函数:
myName = new(string)
*myName,_ = reader.ReadString('\n')
或者不使用指针,只需声明myName
为非指针:
var (
testBool *bool
myName string
)
// ...
myName,_ = reader.ReadString('\n')
在Go中,您无法访问未初始化的内存。如果您没有明确提供变量的初始值,它将获得其类型的zero value。 string
的零值是空字符串""
,但是原始的myName
是一个指针,指针的零值是nil
。
查看相关问题:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。