我有以下使用泛型的代碼。我知道不能將泛型與方法一起使用,但可以與型別一起使用。從技術上講,我的代碼符合這兩個限制,但我仍然收到錯誤
./main.go:12:9: cannot use generic type GenericCacheWrapper[T any] without instantiation
實體化在 main 函式的第一行。有什么辦法可以做到這一點?這可能被認為是 Golang 錯誤嗎?
import (
"encoding/json"
"fmt"
)
type GenericCacheWrapper[T any] struct {
Container T
}
func (c GenericCacheWrapper) MarshalBinary() (data []byte, err error) {
return json.Marshal(c.Container)
}
func (c GenericCacheWrapper) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, &c.Container)
}
func main() {
wrapper := GenericCacheWrapper[int]{Container: 4}
data, err := wrapper.MarshalBinary()
if err != nil {
panic(err)
}
fmt.Println(data)
}
https://go.dev/play/p/9sWxXYmAcUH
uj5u.com熱心網友回復:
您只需添加[T]到末尾,GenericCacheWrapper或者[_]如果您想明確說明您實際上并未T在函式中使用。
package main
import (
"encoding/json"
"fmt"
)
type GenericCacheWrapper[T any] struct {
Container T
}
func (c GenericCacheWrapper[T]) MarshalBinary() (data []byte, err error) {
return json.Marshal(c.Container)
}
func (c GenericCacheWrapper[T]) UnmarshalBinary(data []byte) error {
return json.Unmarshal(data, &c.Container)
}
func main() {
wrapper := GenericCacheWrapper[int]{Container: 4}
data, err := wrapper.MarshalBinary()
if err != nil {
panic(err)
}
fmt.Println(data)
}
此規則在語言規范中定義:
泛型型別也可能有與之關聯的方法。在這種情況下,方法接收者必須宣告與泛型型別定義中相同數量的型別引數。
但這背后的原因不是很清楚,也許是為了使編譯器/型別檢查的實作更容易。
相關:Go 錯誤:不能在沒有實體化的情況下使用泛型型別
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/461560.html
上一篇:觸發與輸入框相關的事件
下一篇:我怎樣才能正確使用通用?
