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

标签 string go pointers

这是我的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")
成功。
这两个变量(即testBoolmyName)以相同的方式初始化。

最佳答案

这行:

*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 valuestring的零值是空字符串"",但是原始的myName是一个指针,而指针的零值是nil
查看相关问题:
Go pointer first assignment

关于string - 从标准输入读取时,Nil指针取消引用行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64307860/

相关文章:

python - 如何用 Pandas,Python 中的几个指定单词替换一系列中的所有单词?

go - 将结构的字段 slice 为可变参数

c++ - 为什么结构变量超出范围

java - 关于从 String 方法返回字符串的错误

Python:如何从字典列表中创建一个 csv 字符串(无文件)?

ruby - 如何在 Ruby 中将 Strftime 转换为字符串?

go - ConstantTimeByteEq 是如何工作的?

testing - 集成测试,通配符忽略标签

c++ - (*rhs.m_pData) 的含义

c++ - 指向结构体访问冲突写入位置的指针