2016-05-17 137 views
1

考虑下面这个简单的围棋程序函数是否必须满足函数类型的确切签名?

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

回答

2

是的,函数必须满足函数类型的确切签名。在其他情况下会出现类似的情况:一种更正式的说法是,通常是types in Go lack covariance。在这里,您可以将json.NewEncoder换成MyEncoder

我会使用的值类型MyEncoder不是指针*MyEncoder,因为如果你存储一个指针接口值,那么通常你不也需要一个指针接口值只是为了避免副本; here's more on pointers vs. values如果有帮助。

相关问题