func Sqrt(f float64) (float64, error) {
if f < 0 {
return 0, errors.New("math: square root of negative number")
// 实现
在下面的例子中,我们在调用 Sqrt 的时候传递的一个负数,然后就得到了 non-nil 的 error 对象,将此对象与 nil 比较,结果为 true,所以 fmt.Println(fmt 包在处理 error 时会调用 Error 方法)被调用,以输出错误,请看下面调用的示例代码:
result, err:= Sqrt(-1)
if err != nil {
fmt.Println(err)
package
main
import
(
"fmt"
// 定义一个 DivideError 结构
type
DivideError
struct
{
dividee
int
divider
int
// 实现 `error` 接口
func
(
de
*
DivideError
)
Error
()
string
{
strFormat
:=
`
Cannot proceed, the divider is zero.
dividee: %d
divider: 0
return
fmt
.
Sprintf
(
strFormat
,
de
.
dividee
)
// 定义 `int` 类型除法运算的函数
func
Divide
(
varDividee
int
,
varDivider
int
)
(
result
int
,
errorMsg
string
)
{
if
varDivider
==
0
{
dData
:=
DivideError
{
dividee
:
varDividee
,
divider
:
varDivider
,
errorMsg
=
dData
.
Error
()
return
}
else
{
return
varDividee
/
varDivider
,
""
func
main
()
{
// 正常情况
if
result
,
errorMsg
:=
Divide
(
100
,
10
);
errorMsg
==
""
{
fmt
.
Println
(
"100/10 = "
,
result
)
// 当除数为零的时候会返回错误信息
if
_
,
errorMsg
:=
Divide
(
100
,
0
);
errorMsg
!=
""
{
fmt
.
Println
(
"errorMsg is: "
,
errorMsg
)
执行以上程序,输出结果为:
100/10 = 10
errorMsg is:
Cannot proceed, the divider is zero.
dividee: 100
divider: 0
在调试程序时,通过 panic 来打印堆栈,方便定位错误。