猿问

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

当在结构中打印错误类型字段的 nil 值时,以下代码会出现 panic。为什么?


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},如何在不引起恐慌的情况下打印它?


慕后森
浏览 118回答 2
2回答

繁花不似锦

在 中tc,您要嵌入类型的值error。Sprintf看到tc实现error(因为嵌入),并尝试调用Error()它,这会触发错误,因为值为nil.如果您想在不引起恐慌的情况下打印它,请不要嵌入error(将其放在命名字段中),或确保嵌入的error值不是nil.

Smart猫小萌

我不知道为什么,但这似乎解决了它......type tc struct {&nbsp; &nbsp; Num int&nbsp; &nbsp; Err error}
随时随地看视频慕课网APP

相关分类

Go
我要回答