这是我的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", false, "test bool flag")
成功。这两个变量(即
testBool
和myName
)以相同的方式初始化。
最佳答案
这行:
*myName, _ = reader.ReadString('\n')
表示给myName
指针指向的位置分配一个值。但是它没有指向任何地方,它的值是nil
。您不能取消引用nil
指针,这是您遇到的运行时 panic 。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
。查看相关问题:
Go pointer first assignment
关于string - 从标准输入读取时,Nil指针取消引用行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64307860/