微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从标准输入读取时,Nil指针取消引用行为

如何解决从标准输入读取时,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")

成功。

两个变量(即testBoolmyName)的初始化方式相同。

解决方法

此行:

*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 valuestring的零值是空字符串"",但是原始的myName是一个指针,指针的零值是nil

查看相关问题:

Go pointer first assignment

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。