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
类型?@LiamKellybinfunc
通过实现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
。