86_Go基础_1_54 自定义结构体实现错误2

 1 package main
 2 
 3 import "fmt"
 4 
 5 type areaError struct {
 6     msg    string  // 错误的描述
 7     lenght float64 // 发生错误的时候,矩形的长度
 8     width  float64 // 发生错误的时候,矩形的宽度
 9 }
10 
11 func (e *areaError) Error() string {
12     return e.msg
13 }
14 
15 func (e *areaError) legnthNegative() bool {
16     return e.lenght < 0
17 }
18 
19 func (e *areaError) widthNegative() bool {
20     return e.width < 0
21 }
22 
23 func rectArea(length, width float64) (float64, error) {
24     msg := ""
25     if length < 0 {
26         msg = "长度小于零"
27     }
28     if width < 0 {
29         if msg == "" {
30             msg = "宽度小于零"
31         } else {
32             msg += ",宽度也小于零"
33         }
34     }
35 
36     if msg != "" {
37         return 0, &areaError{msg, length, width}
38     }
39     return length * width, nil
40 }
41 
42 func main() {
43     length, width := 6.7, -9.1
44     area, err := rectArea(length, width)
45     if err != nil {
46         fmt.Println(err) // 宽度小于零
47         if err, ok := err.(*areaError); ok {
48             if err.legnthNegative() {
49                 fmt.Printf("error:长度,%.2f,小于零\n", err.lenght)
50             }
51             if err.widthNegative() {
52                 fmt.Printf("error:宽度,%.2f,小于零\n", err.width)
53                 // error:宽度,-9.10,小于零
54             }
55         }
56         return
57     }
58     fmt.Println("矩形的面积是:", area)
59 }