【问题标题】:convert function type in Golang在 Golang 中转换函数类型
【发布时间】:2015-09-04 19:00:44
【问题描述】:
// 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错误接口变量?

【问题讨论】:

  • 请提供更详细的样本,请使用play.golang.org。我只是不明白你。什么是add,什么是binFunc

标签: go


【解决方案1】:

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

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

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

所以如果你创建一个函数add:

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

您可以将其转换为binFunc

binFunc(add)

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

var err error
var bf binFunc = binFunc(add)
err = bf

fmt.Println 的行为是在错误for you 时调用.Error()

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

所以回答你的问题:

  • Error 方法被执行,因为fmt.Println 查找error 类型的参数,调用.Error() 并打印结果字符串。
  • 您可以将binFuncs 分配给err,因为binFunc 有一个Error 方法。您不能将add 直接分配给err,因为它没有Error 方法。但是您可以将add 转换为binFunc,因为它们具有相同的函数签名,然后您可以将其分配给err 变量。

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 2020-06-11
    • 1970-01-01
    • 2022-01-06
    • 2017-06-21
    • 1970-01-01
    • 2014-01-08
    • 2019-12-02
    • 2014-04-10
    相关资源
    最近更新 更多