Heim  >  Artikel  >  Backend-Entwicklung  >  Generics: In Schnittstellen eingebettete Einschränkungen und Strukturen

Generics: In Schnittstellen eingebettete Einschränkungen und Strukturen

王林
王林nach vorne
2024-02-08 23:21:19534Durchsuche

Generics: In Schnittstellen eingebettete Einschränkungen und Strukturen

php-Editor Xiaoxin bietet Ihnen eine Einführung in Generika. Generics sind in Schnittstellen eingebettete Einschränkungen und Strukturen, die es uns ermöglichen, beim Schreiben von Code flexibler und effizienter zu sein. Durch die Verwendung von Generika können wir Typfehler zur Kompilierungszeit finden und beheben und so die Lesbarkeit und Wartbarkeit des Codes verbessern. Generics können uns auch dabei helfen, allgemeinere Datenstrukturen und Algorithmen zu entwerfen und so die Wiederverwendbarkeit von Code zu verbessern. In diesem Artikel befassen wir uns mit den Konzepten, der Verwendung und den praktischen Anwendungen von Generika, um Ihnen zu helfen, generische Programmierung besser zu verstehen und anzuwenden.

Probleminhalt

Der folgende Code kann nicht kompiliert und gemeldet werden ./main.go:35:7: test does not meet constraint (test missing in main.structwithname)

package main

import "fmt"

type Test struct {
    Name string
}

func (t Test) String() string {
    return fmt.Sprintf("Name: %v", t.Name)
}

type StructWithName struct {
    Name string
}

type Constraint interface {
    StructWithName
    // ~struct {
    //  Name string
    // }
    String() string
}

func Print[T Constraint](x T) {
    //s := T{}
    fmt.Printf("Hello %v", x)
}

func main() {
    t := Test{
        Name: "Test",
    }

    Print(t)
}

Wenn ich jedoch den structwithname auskommentiere und den ~struct-Block auskommentiere, lässt er sich einwandfrei kompilieren. Ich kann den semantischen Unterschied zwischen den beiden nicht verstehen.

Was ich versuche, ist eine generische Methode, die eine Struktur auf generische Weise verarbeiten kann, d. h. x := s{} und sie dann an eine externe Bibliothek übergeben kann. In diesem Fall handelt es sich um den Terraform-Anbieter. Der Code in den Ressourcen ist sehr ähnlich. Mich stört die Menge an Duplikaten, die ich bei den vorhandenen Anbietern sehe. In meinem Fall sind die Ressourcen sehr ähnlich, einige liegen dazwischen Standardstrukturen Es gibt nur ein oder zwei Felder darauf. Ich möchte in der Lage sein, eine Reihe generischer Methoden zu schreiben, die alle ähnlichen Dinge tun und nur die Besonderheiten an anderer Stelle haben (duh!).

Ich befinde mich noch in der Anfangsphase meiner Go-Reise und kann Compilerfehler nicht verstehen.

Lösung

Wenn ich das richtig verstehe, ist das, was Sie wirklich wollen, nicht möglich. Go-Generika unterstützen den Zugriff auf eine Teilmenge von Strukturfeldern nicht.

Was die beteiligten Fehler angeht...

Der Name eines

-Typs gibt die Identität des Typs an, und zwei Typen mit unterschiedlichen Namen (keine Aliase füreinander) sind immer unterschiedlich, daher sind test und teststructwithname zwei verschiedene Typen. Das einzige, was sie gemeinsam haben, ist ihr „grundlegender Typ“. Type Constraint Interface { structwithname Eine Schnittstelle ist ein Typsatz, der nur einen Typ enthält, nämlich

, und da test kein Mitglied dieses Typsatzes ist, ist dieser bedeutet, dass kein Typ test verwendet werden darf, um diese Einschränkung zu erfüllen.

type constraint 接口 { structwithname } 接口是一个仅包含一种类型的类型集,即 structwithname,并且由于 test 不是该类型集的成员,这意味着不可能使用 testtype

ist ein unbenannter Typ, und der zugrunde liegende Typ jedes unbenannten Typs ist der Typ selbst, d. h. der zugrunde liegende Typ von struct { name string

iststruct { name string } 是一个无名类型,任何无名类型的底层类型都是该类型本身,即 struct 的底层类型 { name string } is struct { name string }

.

~t,表示任何类型,其底层类型tDie Tilde vor dem Typ in der Einschränkung, also ~t, stellt

jeden

Typ dar, dessen

zugrundeliegender Typ

derselbe ist wie t. Oder genauer gesagt:

Die Typmenge eines Elements der Form

~t ist die Menge aller Typen, deren Basistyp t ist. struct { name string }

Also wenn du es tust 🎜
type Constraint interface { ~struct { Name string } }
🎜Dann enthält der Satz eingeschränkter Typen jeden Typ, dessen Basistyp 🎜 ist. 🎜

Das obige ist der detaillierte Inhalt vonGenerics: In Schnittstellen eingebettete Einschränkungen und Strukturen. 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