简体   繁体   中英

Panic when printing a nil error in a struct

The following code will panic when printing a nil value of an error type field in a struct. Why?

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

Follow up question: if I have such a value tc{1, nil} , how to print it without causing panic?

In tc , you're embedding a value of type error . Sprintf sees that tc implements error (because of embedding), and tries to call Error() on it, which triggers the error because the value is nil .

If you want to print it without causing a panic, don't embed error (put it in a named field), or make sure the embedded error value is not nil .

I don't know why, but this seems to fix it ...

type tc struct {
    Num int
    Err error
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM