Heim >Backend-Entwicklung >Golang >Wie erstelle ich einen generischen Typ für einen Zeiger, der eine Schnittstelle in Go implementiert?

Wie erstelle ich einen generischen Typ für einen Zeiger, der eine Schnittstelle in Go implementiert?

Linda Hamilton
Linda HamiltonOriginal
2024-12-29 20:40:18398Durchsuche

How to Create a Generic Type for a Pointer Implementing an Interface in Go?

Generischer Typ für einen Zeiger, der eine Schnittstelle implementiert

Beim Arbeiten mit Schnittstellen in Go kann es notwendig sein, einen Zeiger auf a zu übergeben Struktur, die die Schnittstelle implementiert. Dies kann beim Definieren generischer Funktionen eine Herausforderung darstellen.

Frage:

Wie kann ich einen generischen Typ für einen Zeiger erstellen, der eine Schnittstelle implementiert?

Antwort:

Option 1: Schnittstelle ändern Definition

  1. Deklarieren Sie die Schnittstelle mit einem Typparameter, um anzugeben, dass ihr implementierender Typ ein Zeiger auf ihren Typparameter sein muss:
type A[P any] interface {
    SomeMethod()
    *P
}
  1. Ändern Sie die Signatur des Handlers:
func Handler[P any, T A[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

Option 2: Wrapping the Interface (If Eine Änderung der Definition ist nicht möglich)

  1. Erstellen Sie eine Wrapper-Schnittstelle, die die ursprüngliche Schnittstelle einbettet und einen Zeiger auf ihren Typparameter hinzufügt:
type MyA[P any] interface {
    A
    *P
}
  1. Ändern Sie die Signatur des Handlers, um das Verpacken zu akzeptieren Schnittstelle:
func Handler[P any, T MyA[P]](callback func(result T)) {
    result := new(P)
    callback(result)
}

Verwendung:

Beide Optionen ermöglichen die Übergabe eines Zeigers auf eine Struktur, die die A-Schnittstelle zum generischen Funktionshandler implementiert. Zum Beispiel:

type Aimpl struct {}

func (a *Aimpl) SomeMethod() {}

func main() {
    Handler(func(a *Aimpl) { fmt.Printf("%#v\n", a) })
}

Das obige ist der detaillierte Inhalt vonWie erstelle ich einen generischen Typ für einen Zeiger, der eine Schnittstelle in Go implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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