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

函数是否必须满足函数类型的确切签名?

函数是否必须满足函数类型的确切签名?

Go
肥皂起泡泡 2022-01-10 16:50:53
考虑以下简单的 go 程序package mainimport (    "io"    "encoding/json"    "os")type MyEncoder interface {    Encode(v interface{}) error}type MyEncoderCreator func(io.Writer) *MyEncodertype MyContainer struct {    Creator MyEncoderCreator}func main() {    container := Container{        Creator:json.NewEncoder,    }    encoder := container.Creator(os.Stdout)    encoder.Encode(map[string]string{"key":"value"})}此程序无法编译并出现以下错误:./main.go:21: cannot use json.NewEncoder (type func(io.Writer) *json.Encoder) as type MyEncoderCreator in field value为什么是这样?该json.Encoder结构有一个满足MyEncoder接口的接收器。那么是否应该json.NewEncoder允许将该功能分配给MyContainer.Creator?
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

是的,函数必须满足函数类型的确切签名。在其他情况下也会出现类似的情况:更正式的说法是Go 中的类型通常缺乏协方差。在这里,您可以包装json.NewEncoder一个返回的函数MyEncoder

我会使用值类型MyEncoder不是指针*MyEncoder,因为如果你存储一个指针的接口值,那么通常你不也需要一个指针该接口值只是为了避免副本; 如果有帮助,这里有更多关于指针与值的信息


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号