0

运行以下代码时,我收到“恐慌:运行时错误:无效的内存地址或 nil 指针取消引用”。我不明白为什么并且似乎无法从我认为问题所在的 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)
    }   
}
4

2 回答 2

6

如果你添加

fmt.Println(w)

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

此外,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* w于 C++ 中的代码,很明显w在这种情况下将包含null或更可能包含一些不确定的垃圾。(Go 保证确实如此null)。

于 2013-10-05T10:29:00.663 回答
2
var w io.Writer

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

w = os.Stdout
于 2013-10-05T10:29:12.940 回答