我想要一個接口,它可以將任何類型的參數傳遞給它的單一方法,並且我想要一個帶有泛型的單一實作結構。
這是我的問題的超級簡化版本:
package main type MyInterface interface { Set(val any) } type MyStruct[T any] struct { val T } func NewMyStruct[T any]() *MyStruct[T] { return &MyStruct[T]{} } func (s *MyStruct[T]) Set(val T) { s.val = val } func main() { var obj MyInterface obj = NewMyStruct[any]() // accepted obj = NewMyStruct[int]() // not accepted obj = NewMyStruct[string]() // not accepted }
有沒有一種方法可以滿足編譯器的要求,並且在直接處理結構體時不會遺失 Set 方法的類型資訊?
我認為你的程式碼可以這樣修改
package main import "fmt" type MyInterface[T any] interface { Set(value T) } type MyStruct[T any] struct { val T } func NewMyStruct[T any]() *MyStruct[T] { return &MyStruct[T]{} } func (s *MyStruct[T]) Set(val T) { s.val = val } func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() var obj2 MyInterface[string] obj2 = NewMyStruct[string]() var obj3 MyInterface[any] obj3 = NewMyStruct[any]() }
每當使用參數化類型時,都必須將其定義中的類型參數替換為實際類型。這意味著必須實例化介面中的泛型類型。為此,您的介面應該這樣聲明。
// As-is type MyInterface interface { Set(val any) } // To-be type MyInterface[T any] interface { Set(val T) }
並且在使用它時,您應該明確該 any
使用的是什麼類型。
func main() { var obj1 MyInterface[int] obj1 = NewMyStruct[int]() }
我引用了兩頁
[2] 如何實作通用介面?
以上是在 Go 中使用泛型類型結構實作介面方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!