err != nil
第一个问题是:为什么值为 nil 的 error 却不等于 nil?
思考如下代码:
package main
import (
"errors"
"fmt"
)
type Err struct {
err string
}
func (e *Err) Error() string {
return e.err
}
func returnErr() *Err {
return nil
}
func main() {
var err error
err = returnErr()
fmt.Println(err, err != nil)
}
首先 returnErr()
返回了一个值为 nil 的 *Err,然后赋值给了 err,那么 fmt 会打印什么结果?是不是:
<nil> false
错,它会打印 <nil> true
。当时自己也是没有头绪,学艺不精,问过大神才知道,这是接口 interface 造成的。具体可以查看 官网 FAQ。
简单说,interface 被两个元素 value 和 type 所表示。只有在 value 和 type 同时为 nil 的时候,判断 interface == nil
才会为 true。而 err = returnErr()
这个过程中,虽然 value 为 nil,但 typ