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

为什么io.WriterString上出现运行时错误?,io,go,Io,Go,当运行以下代码时,我得到一个“panic:runtime error:invalid memory address或nil pointer dereference”。我不明白为什么,而且似乎无法从io.WriteString(w,s)中捕捉到错误,我认为这是问题所在。谁能给我指出正确的方向吗 package main import( "io" "fmt" ) func main() { s := "hei" var w io.Writer _, err

当运行以下代码时,我得到一个“panic:runtime error:invalid memory address或nil pointer dereference”。我不明白为什么,而且似乎无法从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)
    }   
}
如果你加上

fmt.Println(w)
就在
var w io.Writer
之后,您将看到打印的是
。这意味着您只是创建一个变量,而不是将其初始化为实际值。然后尝试将其传递给需要实
io.Writer
对象但得到nil的函数

另外,
io.Writer
是一个接口(请参阅),因此您需要找到它的具体实现(例如
os.Stdout
)来实例化它

有关
io
软件包的更多信息,请参阅

<强> P.S.< /强>也许你把这个与C++混淆了;在C++中,当你做了代码> IO::作者W< /Cuff>,然后C++代码> W/COD>自动初始化为<代码> IO::作者< /COD>,但是,GO代码<代码> var WIO。很明显,在这种情况下,

w
将包含
null
或者更可能是一些不确定的垃圾。(Go保证它是
null

w
初始化为
nil
写入程序。你需要把它指向一个真正的作者来做任何有用的事情,例如

w = os.Stdout
w = os.Stdout