为了账号安全,请及时绑定邮箱和手机立即绑定

Golang中的函数类型转换

Golang中的函数类型转换

Go
茅侃侃 2021-11-08 10:01:59
// Each type have Error() string method.// The error built-in interface type is the conventional interface for// representing an error condition, with the nil value representing no error.//  type error interface {//   Error() string//  }func (f binFunc) Error() string {    return "binFunc error"}func func_type_convert() {    var err error    err = binFunc(add)    fmt.Println(err)    fmt.Println(i)}我对上面的代码有两个问题:我不知道为什么该Error方法会在add函数转换为binFunc类型时执行?为什么add函数转换结果能够赋值给一个err错误接口变量?
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

error 是一个接口:


type error interface {

    Error() string

}

这意味着任何具有方法的类型:Error() string满足接口并且可以分配给类型的变量error。


binFunc 有这样一个方法:


func (f binFunc) Error() string {

    return "binFunc error"

}

Go 中的新开发人员有时会发现这令人困惑,因为他们没有意识到可以将方法附加到不仅仅是结构体。在这种情况下binFunc定义如下:


type binFunc func(int, int) int

因此,它的工作方式是您可以转换具有相同签名的任何函数:(来自规范)


函数类型表示具有相同参数和结果类型的所有函数的集合。


因此,如果您创建一个函数add:


func add(x, y int) int {

    return x + y

}

您可以将其转换为binFunc:


binFunc(add)

由于我们上面定义的Error方法binFunc,我们可以将这个 new 分配binFunc给一个类型的变量error:


var err error

var bf binFunc = binFunc(add)

err = bf

fmt.Println的行为是为您调用.Error()错误:


如果操作数实现了错误接口,则将调用 Error 方法将对象转换为字符串,然后根据动词(如果有)的要求对其进行格式化。

所以回答你的问题:


Error执行该方法是因为fmt.Println查找 type 的参数error,调用.Error()并打印结果字符串。

您可以将binFuncs分配给err因为binFunc有一个Error方法。您不能add直接分配给,err因为它没有Error方法。但是您可以转换add为 a ,binFunc因为它们具有相同的函数签名,这样您就可以将其分配给err变量。


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信