Go 函数是否必须满足函数类型的精确签名?
考虑以下简单的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
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
,因为如果在接口值中存储指针,那么通常不需要指向接口值的指针来避免复制;如果有帮助的话