考慮以下簡單的 go 程序package mainimport ( "io" "encoding/json" "os")type MyEncoder interface { Encode(v interface{}) error}type MyEncoderCreator func(io.Writer) *MyEncodertype 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 回答

忽然笑
TA貢獻1806條經驗 獲得超5個贊
是的,函數必須滿足函數類型的確切簽名。在其他情況下也會出現類似的情況:更正式的說法是Go 中的類型通常缺乏協方差。在這里,您可以包裝json.NewEncoder
一個返回的函數MyEncoder
。
我會使用值類型MyEncoder
不是指針*MyEncoder
,因為如果你存儲一個指針內的接口值,那么通常你不也需要一個指針到該接口值只是為了避免副本; 如果有幫助,這里有更多關于指針與值的信息。
- 1 回答
- 0 關注
- 169 瀏覽
添加回答
舉報
0/150
提交
取消