【问题标题】:why runtime error on io.WriterString?为什么 io.WriterString 出现运行时错误?
【发布时间】:2013-10-05 10:21:46
【问题描述】:

运行以下代码时,我收到“恐慌:运行时错误:无效的内存地址或 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)
    }   
}

【问题讨论】:

    标签: io go


    【解决方案1】:

    如果你添加

    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/

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

    【讨论】:

      【解决方案2】:
      var w io.Writer
      

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

      w = os.Stdout
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多