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

Go 函数是否必须满足函数类型的精确签名?,go,Go,考虑以下简单的go程序 package main import ( "io" "encoding/json" "os" ) type MyEncoder interface { Encode(v interface{}) error } type MyEncoderCreator func(io.Writer) *MyEncoder type MyContainer struct { Creator MyEncoderCreator } func

考虑以下简单的go程序

package main

import (
    "io"
    "encoding/json"
    "os"
)

type MyEncoder interface {
    Encode(v interface{}) error
}

type MyEncoderCreator func(io.Writer) *MyEncoder

type 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

是的,函数必须满足函数类型的精确签名。在其他情况下也会出现类似的情况:一般来说,更正式的说法是这样的。在这里,您可以将
json.NewEncoder
包装到返回
MyEncoder
的函数中

我会使用值类型
MyEncoder
而不是指针
*MyEncoder
,因为如果在接口值中存储指针,那么通常不需要指向接口值的指针来避免复制;如果有帮助的话