首頁  >  文章  >  後端開發  >  在 Go 中使用泛型類型結構實作介面方法

在 Go 中使用泛型類型結構實作介面方法

WBOY
WBOY轉載
2024-02-06 08:20:04478瀏覽

在 Go 中使用泛型类型结构实现接口方法

問題內容

我想要一個接口,它可以將任何類型的參數傳遞給它的單一方法,並且我想要一個帶有泛型的單一實作結構。

這是我的問題的超級簡化版本:

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]()
}

我引用了兩頁

[1] Go錯誤:無法使用泛型不實例化的型別

[2] 如何實作通用介面?

以上是在 Go 中使用泛型類型結構實作介面方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除