为什么运行时错误在io.WriterString上?

sti*_*ian 0 io go

运行以下代码时出现"恐慌:运行时错误:无效的内存地址或无指针取消引用".我不明白为什么,似乎无法从我相信问题所在的io.WriteString(w,s)中捕获错误.任何人都能指出我正确的方向吗?

package main

import(
    "io"
    "fmt"
)

func main() {
    s := "hei"
    var w io.Writer
    _, err := io.WriteString(w, s)
    if err != nil{
    fmt.Println(s)
    }   
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*lun 6

如果你添加

fmt.Println(w)
Run Code Online (Sandbox Code Playgroud)

之后var w io.Writer,你会看到印刷的是<nil>.这意味着您只是创建一个变量,而不是将其初始化为实际值.然后,您尝试将其传递给需要真实io.Writer对象的函数,但得到的值为零.

另外,io.Writer是一个接口(请参阅http://golang.org/pkg/io/#Writer),因此您需要找到它的具体实现(例如os.Stdout)才能实例化它.

有关该io软件包的更多信息,请参阅http://golang.org/pkg/io/.

PS也许你会把它与C++混淆; 在C++中,当你这样做时io::Writer w,会w自动初始化以包含一个新的副本io::Writer,但是,Go代码var w io.Writer实际上与io::Writer* wC++相同,很明显,w在这种情况下,它将包含null或更多可能是一些不确定的垃圾.(去保证它是null).