小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《在结构中打印 nil 错误时出现恐慌》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!
问题内容当打印结构体中错误类型字段的 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
}
好了,本文到此结束,带大家了解了《在结构中打印 nil 错误时出现恐慌》,希望本文对你有所帮助!关注编程网公众号,给大家分享更多Golang知识!