在结构中打印nil错误时出现恐慌

时间:2019-01-25 16:08:36

标签: go

当在结构中打印错误类型字段的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},如何在不引起恐慌的情况下打印它?

2 个答案:

答案 0 :(得分:1)

tc中,您要嵌入类型error的值。 Sprintf看到tc实现了error(由于嵌入),并尝试在其上调用Error(),这会触发错误,因为值是nil

如果要打印而不会引起恐慌,请不要嵌入error(将其放在命名字段中),或确保嵌入的error的值不是nil

答案 1 :(得分:0)

我不知道为什么,但这似乎可以解决...

type tc struct {
    Num int
    Err error
}