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

时间:2013-10-05 10:21:47

标签: 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)
    }   
}

2 个答案:

答案 0 :(得分:6)

如果你添加

fmt.Println(w)

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

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

有关io包的详细信息,请参阅http://golang.org/pkg/io/

P.S。也许你会把它与C ++混淆;在C ++中,当您执行io::Writer w时,w会自动初始化为包含io::Writer的新副本,但是,Go代码var w io.Writer实际上等同于{{1}在C ++中,显然io::Writer* w在这种情况下将包含w或更多可能是一些不确定的垃圾。 (去保证它虽然是null

答案 1 :(得分:2)

var w io.Writer

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

w = os.Stdout