go处理错误的方式非常原始和有效,go是通过function返回error类型而非主流语言抛出异常。在golang里永远不要忽略错误,否则可能导致程序的意外崩溃。
通常用如下方式检测错误:
if value, err := pack1.Func1(param1); err != nil {
fmt.Printf(“Error %s in pack1.Func1 with parameter %v”, err.Error(), param1)
return // or: return err
}
// Process(value)
type error interface {
Error() string
}
package main
import (
"fmt"
"errors"
)
type myError struct{}
func (this *myError) Error() string { return "" }
func main() {
//方法一:采用errors包的New方法 返回一个err的类型
var err1 error = errors.New("this is an error")
fmt.Println(err1.Error())
//方法二:采用fmt.Errof 将string信息转化为error信息 并返回
err2 := fmt.Errorf("%s", "the error test for fmt.Errorf")
fmt.Println(err2.Error())
//方法三:自定义error,下面细说
}
package main
import (
"math"
"fmt"
"reflect"
)
// 定义接口 Abser
type Abser interface {
Abs() float64
}
// 定义结构体 Vertex
type Vertex struct {
X, Y float64
}
// 实现方法 Abs
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := Vertex{3, 4}
// 成功,能够持有 *Vertex 类型的值
var a Abser = &v
fmt.Println(reflect.TypeOf(v)) //main.Vertex
fmt.Println(reflect.TypeOf(a)) //*main.Vertex
// 出错,不能持有 Vertex 类型的值
// 因为在 *Vertex 上定义了方法 Abs,而未在 Vertex 上定义
//var b Abser = v
}
package main
import (
"errors"
"fmt"
"reflect"
)
type myError struct{}
func (this *myError) Error() string { return "" }
func bad() bool {
return true
}
//自定义错误返回函数
func test() error {
var p *myError = nil
if bad() {
return p
}
return nil
}
//只是返回错误非空
func test1() error {
var val error = errors.New("val")
return val
}
func main() {
var e error = test()
if e == nil {
fmt.Println("e is nil")
} else {
fmt.Println(reflect.TypeOf(e))
fmt.Println(reflect.ValueOf(e))
fmt.Println("e is not nil")
}
var e1 error = test1()
if e1 == nil {
fmt.Println("e1 is nil")
} else {
fmt.Println("e1 is not nil")
fmt.Println(e1.Error())
}
/*输出如下:
*main.myError
<nil>
e is not nil
e1 is not nil
val
*/
}