go - 为什么 Go 中的错误可以为零?
问题描述
Go 中的错误可以为零。以下编译:
var err error
err = nil
err = errors.New("hello")
然而错误是值,而值类型在 Go 中不能为空。
看error
,是一个普通的界面:
type error interface {
Error() string
}
由这个结构实现:
type errorString struct {
s string
}
这里没有指针。有一种方法需要一个指针接收器,
func (e *errorString) Error() string {
return e.s
}
然而,这并不能解释为什么error
表现为指针而不是值。
errors.New()
确实返回一个指针,
func New(text string) error {
return &errorString{text}
}
这使我上面的第三行代码更加令人费解——我们将结果分配New
给一个值变量。
这是如何运作的?
解决方案
我想你可能混淆了一些概念。是的,“错误是值”,因为它们不是可以抛出的异常,而是它们只是从函数返回的常规值,就像任何其他返回值一样。Go 质量“错误就是值”与值与引用语义无关。
内置类型error
是 an interface
,所有接口值都是可空的,所以error
也是可空的。
推荐阅读
- websphere - 限制对战争资源的访问
- javascript - 当最后一行从 IFTTT 接收到数据时,如何用公式自动填充最后一行?
- asterisk - Asterisk Regex 检查输入的数字是否有 10 位数字
- google-sheets - 使用条件合并两个表(查询?)
- python - np.where, np.busday_count() 和 pandas 列
- react-native - React Native 中的 Vertical ScrollView 中的 Horizontal ScrollView
- sql - 如何在 Hive 中将 table1 中的一列附加到 table2?
- rabbitmq - 使用masstransit的rabbitmq中的队列所需的最低只写权限
- javascript - Vue watch 两个链接的输入字段仅用于用户输入
- flutter - Flutter 更新 FutureBuilder 中的 Textfeild 值