2016-05-17 138 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如果有幫助。

相關問題