考虑以下简单的程序
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
?
答案 0 :(得分:3)
是的,函数必须满足函数类型的确切签名。类似的事情在其他情境中出现:一种更正式的方式来表达它通常是types in Go lack covariance。在这里,您可以将json.NewEncoder
包装在返回MyEncoder
的函数中。
我使用值类型MyEncoder
而不是指针*MyEncoder
,因为如果将指针存储在接口值中,那么通常你也不需要指针 to 接口值只是为了避免复制; here's more on pointers vs. values如果有帮助的话。