错误
使用 Go 内置接口 error 表达错误状态,类似于 Stringer 描述自身:
go
type error interface {
Error() string
}实现 error 接口的类型一般会返回 error 值,具体类型是字符串,调用代码应该通过测试错误是否等于 nil 来处理错误。
go
i, err := strconv.Atoi("42")
if err != nil {
fmt.Printf("couldn't convert number: %v\n", err)
return
}
fmt.Println("Converted integer:", i)简单示例
go
package main
import (
"fmt"
"time"
)
type MyError struct {
When time.Time
What string
}
func (e *MyError) Error() string {
return fmt.Sprintf("at %v, %s",
e.When, e.What)
}
func run() error {
return &MyError{
time.Now(),
"it didn't work",
}
}
func main() {
if err := run(); err != nil {
fmt.Println(err)
}
}复杂示例
go
package main
import (
"fmt"
)
type ErrNegativeSqrt float64
func (e ErrNegativeSqrt) Error() string {
// 注意:这里必须将 e 转换为 float64,否则 fmt.Sprint(e) 会无限递归调用 Error()
return fmt.Sprintf("cannot Sqrt negative number: %v", float64(e))
}
func Sqrt(x float64) (float64, error) { // 返回两个数值
if x < 0 {
return 0, ErrNegativeSqrt(x) // 返回错误
}
z := 1.0
for i := 0; i < 10; i++ {
z -= (z*z - x) / (2 * z)
}
return z, nil
}
func main() {
fmt.Println(Sqrt(2))
fmt.Println(Sqrt(-2))
}