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