Heim >Backend-Entwicklung >Golang >Implementierung von Schnittstellenmethoden mithilfe generischer Typstrukturen in Go

Implementierung von Schnittstellenmethoden mithilfe generischer Typstrukturen in Go

WBOY
WBOYnach vorne
2024-02-06 08:20:04507Durchsuche

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

Frageninhalt

Ich möchte eine Schnittstelle, die Parameter jedes Typs an ihre einzelne Methode übergeben kann, und ich möchte eine einzelne Implementierungsstruktur mit Generika.

Dies ist eine stark vereinfachte Version meines Problems:

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
}

Gibt es eine Möglichkeit, die Anforderungen des Compilers zu erfüllen, ohne die Typinformationen der Set-Methode zu verlieren, wenn direkt mit der Struktur gearbeitet wird?


Richtige Antwort


Code

Ich denke, Ihr Code kann so geändert werden

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

Anleitung

Wenn Sie einen parametrisierten Typ verwenden, müssen Sie die Typparameter in seiner Definition durch den tatsächlichen Typ ersetzen. Das bedeutet, dass der generische Typ in der Schnittstelle instanziiert werden muss. Dazu sollte Ihre Schnittstelle so deklariert sein.

// As-is
type MyInterface interface {
    Set(val any)
}
// To-be
type MyInterface[T any] interface {
    Set(val T)
}

Und wenn Sie es verwenden, sollten Sie sich darüber im Klaren sein, welchen Typ any Sie verwenden.

func main() {
    var obj1 MyInterface[int]
    obj1 = NewMyStruct[int]()
}

Ich habe zwei Seiten zitiert

[1] Go-Fehler: Generische, nicht instanziierte Typen können nicht verwendet werden

[2] Wie implementiert man eine universelle Schnittstelle?

Das obige ist der detaillierte Inhalt vonImplementierung von Schnittstellenmethoden mithilfe generischer Typstrukturen in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen