![](/img/trans.png)
[英]Go Error: panic: runtime error: invalid memory address or nil pointer dereference. Changing map inside a struct which is present in another struct,
[英]Panic when printing a nil error in a struct
當在結構中打印錯誤類型字段的nil值時,以下代碼會驚慌。 為什么?
package main
import (
"fmt"
)
type ta struct {
int
}
type tb struct {
int
*ta
}
type tc struct {
int
error
}
type td struct {
int
error interface{}
}
func main() {
fmt.Println(fmt.Sprintf("%v", ta{1}))
fmt.Println(fmt.Sprintf("%v", tb{1, nil}))
fmt.Println(fmt.Sprintf("%v", tc{1, nil}))
fmt.Println(fmt.Sprintf("%v", td{1, nil}))
}
▸ go run main.go
{1}
{1 <nil>}
%!v(PANIC=runtime error: invalid memory address or nil pointer dereference)
{1 <nil>}
https://play.golang.org/p/SrzUsJ3pyRC
跟進問題:如果我有tc{1, nil}
這樣的值,如何打印而不會引起恐慌?
在tc
,您要嵌入類型為error
的值。 Sprintf
看到tc
實現了error
(由於嵌入),並嘗試在其上調用Error()
,這會觸發錯誤,因為該值為nil
。
如果要打印而不會引起緊急情況,請不要嵌入error
(將其放在命名字段中),或確保嵌入的error
值不是nil
。
我不知道為什么,但這似乎可以解決...
type tc struct {
Num int
Err error
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.