Go函数类型作为接口值

Go函数类型作为接口值,go,Go,我一直在阅读关于围棋的文章,我遇到了一个我还没有弄明白的例子。这是: type binFunc func(int, int) int func add(x, y int) int { return x + y } func (f binFunc) Error() string { return "binFunc error" } func main() { var err error err = binFunc(add) fmt.Println(err) } 你们

我一直在阅读关于围棋的文章,我遇到了一个我还没有弄明白的例子。这是:

type binFunc func(int, int) int

func add(x, y int) int { return x + y }

func (f binFunc) Error() string { return "binFunc error" }

func main() {
    var err error
    err = binFunc(add)
    fmt.Println(err)
}
你们可以在运动场上找到它


我知道您可以将方法分配给函数类型,但我不知道如何调用
Error()

fmt包的文件中有这样一句话:

使用动词
%T
%p
打印时除外,特殊格式 注意事项适用于实现某些接口的操作数。 按申请顺序:

如果格式(对于
Println
等隐式地为
%v
)对 字符串(
%s%q%v%x%x
),以下两条规则适用:

  • 如果操作数实现了
    error
    接口,将调用
    error
    方法将对象转换为字符串,然后 按照动词(如果有)的要求格式化
  • 如果操作数实现方法
    String()String
    ,将调用该方法将对象转换为字符串,然后 按照动词(如果有)的要求格式化

  • 换句话说,
    fmt.Println
    将尝试打印接口的字符串表示形式。由于错误接口由
    binFunc
    满足,因此它调用
    binFunc

    error
    方法。好的,我尝试通过实现
    String()
    方法将此知识应用到中,但现在我得到了一个赋值错误。如何将
    binfunc(add)
    分配给
    error
    类型,而不是
    string
    类型?@LiamKelly
    binfunc
    通过实现
    error()string
    方法来满足
    error
    接口。请注意,
    binFunc(add)
    的类型仍然是
    main.binFunc
    fmt.Printf(“%T\n”,err)
    也会这么说),而不是
    string
    。由于
    error
    是一个接口,并且
    binFunc
    满足该接口,因此可以使用
    err=binFunc(add)
    。如果删除了
    Error
    方法并保留了
    String
    方法,则会收到编译错误,因为
    binFunc
    Error
    不再是兼容类型,因为
    binFunc
    没有实现
    Error
    方法。尝试
    var str fmt.Stringer
    而不是
    string
    ;)@LiamKelly,正如@user539810所指出的!。您不能将
    binFunc(add)
    分配给“string”类型,这是因为binFunc没有实现
    string
    接口(因为在fmt包或universe块中都没有这样的接口)
    string
    只是一个类型,而不是一个接口,任何给定类型实现
    string()string
    都不会使该类型成为
    string
    。它使它成为一个
    Stringer
    ,因为实际的接口是:
    Stringer
    。因此,如果您希望编译并运行第二个示例,只需将行
    var str string
    更改为
    var str fmt.Stringer