Heim >Backend-Entwicklung >Golang >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.
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.
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 test
和 structwithname
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
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
不是该类型集的成员,这意味着不可能使用 test
type
struct { name string
iststruct { name string }
是一个无名类型,任何无名类型的底层类型都是该类型本身,即 struct 的底层类型 { name string }
is struct { name string }
~t
,表示任何类型,其底层类型与 t
Die Tilde vor dem Typ in der Einschränkung, also ~t
, stellt
Typ dar, dessen
zugrundeliegender Typ derselbe ist wie t
. Oder genauer gesagt:
~t ist die Menge aller Typen, deren Basistyp t ist. struct { name string }
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!