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

Implementierung von Schnittstellenmethoden mithilfe generischer Typstrukturen in Go

WBOY
Freigeben: 2024-02-06 08:20:04
nach vorne
500 Leute haben es durchsucht

在 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
}
Nach dem Login kopieren

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]()
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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]()
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage