在Golang中转换函数类型

周杰森:
// 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)
}

我对上面的代码有两个问题:

  • 我不知道为什么Erroradd函数转换为binFunc类型时执行方法
  • 为什么add函数转换的结果能够分配给err错误接口变量?
迦勒:

error 是一个接口:

type error interface {
    Error() string
}

这意味着任何具有方法的类型:都会Error() string实现接口并可以分配给type的变量error

binFunc 有这样一种方法:

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

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

type binFunc func(int, int) int

因此,此方法的工作方式是允许您转换具有相同签名的任何函数:(来自spec

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

因此,如果您创建一个函数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()错误

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

因此,回答您的问题:

  • Error执行方法是因为fmt.Println查找类型为的参数error,将调用.Error()并打印结果字符串。
  • 您可以将分配给binFuncerr因为binFunc它具有Error方法。您不能add直接分配err因为它没有Error方法。但你被允许转换addbinFunc,因为它们具有相同的函数签名,并通过这样做,你可以把它分配给err变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章