golang关于自定义类型实现error接口的一个疑问,刚开始学习go语言有点不太明白

1. 运行环境

golang版本:go version go1.16.2 windows/amd64

3). 当前系统

Windows 10

2. 问题描述?

我在下面代码中中定义了MyFloat自定义类型,定义了类型值方法Error,实现了go中的error接口,但是在使用中有点疑问,为何MyFloat(3.2)可以直接调用Error方法,不是应该MyFloat(3.2).Error()调用一下吗

package main

import (
    "fmt"
)

type MyFloat float64

func (m MyFloat) Error() string {
    return fmt.Sprintf("Called")
}

func main() {
    a := MyFloat(3.2)
    fmt.Println(a) // 此时输出Called而不是3.2,但是我并没有打印a.Error(),Error()是怎么调用的呢?
}
最佳答案

查了资料,得知对于fmt,有两个比较特殊的方法Error和String,如果直接打印对象a,如果有Error方法,会优先执行a.Error,而不是a本身,如果没有Error方法,再判断有没有String方法,如果有,就执行a.String,而不是本身a。

可参考pkg.go.dev/fmt 中的描述

file

1年前 评论
讨论数量: 4

Println 会判断,然后打印

1年前 评论

查了资料,得知对于fmt,有两个比较特殊的方法Error和String,如果直接打印对象a,如果有Error方法,会优先执行a.Error,而不是a本身,如果没有Error方法,再判断有没有String方法,如果有,就执行a.String,而不是本身a。

可参考pkg.go.dev/fmt 中的描述

file

1年前 评论
Makia98

好问题 :+1:

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!