我是 golang 的新手。我想從服務容器的實作中抽象出來:
type Container interface {
Provide(constructor interface{}, opts ...interface{}) error
Invoke(function interface{}, opts ...interface{}) error
}
但出現錯誤:
#13 0.387 cmd/app/main.go:26:40: cannot use container (type *dig.Container) as type application.Container in argument to application.NewApplication:
#13 0.387 *dig.Container does not implement application.Container (wrong type for Invoke method)
#13 0.387 have Invoke(interface {}, ...dig.InvokeOption) error
#13 0.387 want Invoke(interface {}, ...interface {}) error
我究竟做錯了什么?我如何宣告介面正確?
uj5u.com熱心網友回復:
Cannot use container (type *dig.Container) as type application.Container in argument to application.NewApplication:
*dig.Container does not implement application.Container (wrong type for Invoke method)
have Invoke(interface {}, ...dig.InvokeOption) error
want Invoke(interface {}, ...interface {}) error
這意味著*dig.Container不滿足 interface application.Container。它繼續解釋application.Container需要該Invoke方法采用 的可變引數串列interface{},但*dig.Container采用 的可變引數串列dig.InvokeOption。
盡管空介面可以存盤任何型別,但這并不意味著任何切片型別自動也是空介面的切片(這是泛型的一個很大的動機,它應該很快就會出現)。
我記得我自己也被這個弄糊涂了。考慮這個代碼:
package main
import (
"fmt"
)
type T struct{}
func main() {
var Ts = []T{
T{}, T{}, T{},
}
fmt.Println(Ts...)
}
它不會編譯,甚至以為每一個人T滿足interface{},因為[]T是沒有的[]interface{}:
./prog.go:13:16: 不能在 fmt.Println 的引數中使用 Ts(型別 []T)作為型別 []interface {}
這里最簡單的解決方案是使dig.Container的Invoke函式與 的Invoke簽名匹配application.Container。您仍然可以將*dig.InvokeOptions串列傳遞給它,這些 s 單獨滿足interface{}. 您仍然需要將interface{}s轉換回*dig.InvokeOptions 內的 s dig.Container.Invoke。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/343535.html
標籤:走
