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 }