go - 为什么 `fmt.Println("%T\n", e)` 其中 `e` 是一个错误变量会打印出来而不是它的类型?
问题描述
我最近在玩 Go 语言,遇到了一些至少可以说有点奇怪的东西,让我们考虑一个非常简单的函数:
func main() {
n, e := fmt.Println(`He said: "Hello"`)
fmt.Printf("%T\n", n)
}
输出我所期望的:
He said: "Hello"
int
现在,如果我想显示的类型e
:
func main() {
n, e := fmt.Println(`He said: "Hello"`)
fmt.Printf("%T\n", e)
}
这次打印出来:
He said: "Hello"
<nil>
我得到了没有错误的部分,所以e
是一个空指针:nil
但我没想到它本身就是一个 ~~type~~ 。
为什么我没有得到实际类型?
如果是这样,是否有解决方法?(不是说我的用例是一个现实的用例,但好奇是否有任何可能性)
解决方案
预先声明的类型错误定义为
type error interface { Error() string }
它是表示错误条件的常规接口,nil 值表示没有错误。
接口类型指定称为其接口的方法集。接口类型的变量可以使用作为接口的任何超集的方法集存储任何类型的值。据说这种类型实现了接口。接口类型的未初始化变量的值为 nil。
当通过声明或 new 调用为变量分配存储空间时,或者通过复合文字或 make 调用创建新值时,并且未提供显式初始化,则给出变量或值默认值。这样一个变量或值的每个元素都被设置为它的类型的零值:nil 用于接口。
一个零值error
类型,一个接口,没有类型。它的值是nil
。
推荐阅读
- django - self.method = environ['REQUEST_METHOD'].upper() KeyError: 'REQUEST_METHOD' while setting up django server on EC2 using uwsgi
- bash - 删除文件并提示用户做出决定
- reactjs - TypeError:this.getdataSource 不是函数
- c++ - C++ CURL Json 请求不和谐 API 来发布消息
- javascript - 如何重新选择列表框中的项目?
- python - 有没有办法将日期与可以将其分类为三个类别之一的表格进行比较?
- python - 使用 iterrows() 时修改数据不起作用
- unetstack - unetsim:是否有通过仅指定坐标而不是速度或方向来将节点从一个坐标移动到另一个坐标的功能?
- java - OpenCV:眼睛的矩形从面部 ROI 移位
- python - 将不可接受的单元格转换为“”(空白或跳过)