我有以下通用接口type Worker[input any, output any] interface { Process(input) output}我正在嘗試使用以下方法實現接口type IntWorker[i int, o int] struct{}func (w *IntWorker[i, o]) Process(input i) o { fmt.Println("running i") return 1}當我嘗試使用它時,出現以下錯誤mgr := internal.NewWorkManager()iwkr := &IntWorker[int, int]{}mgr.RegisterWorker(iwkr)cannot use iwkr (variable of type *IntWorker[int, int]) as internal.Worker[any, any] value in argument to : *IntWorker[int, int] does not implement internal.Worker[any, any] (wrong type for method Process) have Process(input int) int want Process(any) any注意最后一段,它說 want anybut have int。我不確定如何解決這個問題,因為我的印象是你可以將任何東西傳遞給any變量被傳遞給這個函數:func (m *WorkManager) RegisterWorker(f Worker[any, any]) uuid.UUID
1 回答

九州編程
TA貢獻1785條經驗 獲得超4個贊
任何應該采用Worker
接口的通用變體的函數本身必須是通用函數。
func TakesAnyWorker[input any, output any](w Worker[input, output]) { ... }
該類型Worker[any, any]
不是通用類型,并且僅與實現的值兼容,Process(any) any
因為這是您的接口定義所指示的。
在您的示例中,該函數是一種方法,在 Go 1.19 中不能采用類型參數。如果 singleWorkManager
總是采用Worker
相同類型的 s ,那么您可以WorkManager
像這樣使 the 成為一個一致的泛型類型:
type WorkManager[input any, output any] struct { ... } func (m *WorkManager[input, output]) RegisterWorker(f Worker[input, output]) uuid.UUID
如果您的單身人士WorkManager
需要采用Worker
不同類型的 s,那么恐怕您遇到的問題比泛型可以解決的問題更大,您將被迫使用常規接口和reflect
.
- 1 回答
- 0 關注
- 92 瀏覽
添加回答
舉報
0/150
提交
取消