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

时间:2016-05-17 04:34:58

标签: 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

1 个答案:

答案 0 :(得分:3)

是的,函数必须满足函数类型的确切签名。类似的事情在其他情境中出现:一种更正式的方式来表达它通常是types in Go lack covariance。在这里,您可以将json.NewEncoder包装在返回MyEncoder的函数中。

我使用值类型MyEncoder而不是指针*MyEncoder,因为如果将指针存储在接口值中,那么通常你也不需要指针 to 接口值只是为了避免复制; here's more on pointers vs. values如果有帮助的话。