golang:json.Unmarshal() 返回“无效的内存地址或零指针取消引用”

我从 websocket 收到一条 json 消息,json 字符串接收正常。然后我调用 json.Unmarshal 得到运行时恐慌。我查看了其他示例,但这似乎是另一回事。这是代码:


func translateMessages(s socket) {

    message := make([]byte,4096)

    for {

        fmt.Printf("Waiting for a message ... \n")

        if n, err := s.Read(message); err == nil {

            command := map[string]interface{}{}

            fmt.Printf("Received message: %v (%d Bytes)\n", string(message[:n]), n)

            err := json.Unmarshal(message[:n],&command)

            fmt.Printf("Received command: %v (Error: %s)\n", command, err.Error())

        }

    }

}

这是输出:


Waiting for a message ... 

Received message: {"gruss":"Hello World!"} (24 Bytes)

panic: runtime error: invalid memory address or nil pointer dereference

[signal 0xb code=0x1 addr=0x20 pc=0x401938]


goroutine 25 [running]:

runtime.panic(0x6f4860, 0x8ec333)

任何提示可能是什么?


沧海一幻觉
浏览 254回答 1
1回答

www说

如果解码 JSON 没有错误,此行将发生恐慌:fmt.Printf("Received command: %v (Error: %s)\n", command, err.Error())如果 err == nil,则 err.Error() 会因 nil 指针推导而发生恐慌。将该行更改为:fmt.Printf("Received command: %v (Error: %v)\n", command, err)如果您正在读取套接字,则无法保证 s.Read() 将读取完整的 JSON 值。编写此函数的更好方法是:func translateMessages(s socket) {  d := json.NewDecoder(s)  for {      fmt.Printf("Waiting for a message ... \n")      var command map[string]interface{}      err := d.Decode(&command)      fmt.Printf("Received command: %v (Error: %v)\n", command, err)      if err != nil {        return      }  }}如果您正在使用 websockets,那么您应该使用 gorilla/webscoket 包和ReadJSON来解码 JSON 值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go