戈朗:json.Unmarshal() returns "invalid memory address or nil pointer dereference"
golang: json.Unmarshal() returns "invalid memory address or nil pointer dereference"
我从 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)
有什么提示吗?
如果解码 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 值。
我从 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)
有什么提示吗?
如果解码 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 值。