Heim >Backend-Entwicklung >Golang >Wie man mit Cuelang eine Bedingung auf ein Strukturfeld eines von einem Golang-Modul generierten Hinweismusters setzt
php-Editor Strawberry stellt Ihnen heute vor, wie Sie Cuelang verwenden, um Bedingungen in den Strukturfeldern des vom Golang-Modul generierten Eingabeaufforderungsmusters zu platzieren. cuelang ist eine leistungsstarke Sprache zum Definieren und Validieren von Datenstrukturen, die sich nahtlos in Golang integrieren lässt. Wenn wir von Golang generierte Module verwenden, stoßen wir häufig auf Situationen, in denen wir Bedingungen für Strukturfelder hinzufügen müssen. In diesem Artikel wird ausführlich erläutert, wie Sie Cuelang verwenden, um diese Anforderung zu erfüllen, und allen dabei helfen, die leistungsstarken Funktionen von Cuelang besser zu verstehen und anzuwenden. Als nächstes werden wir dieses Problem Schritt für Schritt analysieren und relevanten Beispielcode bereitstellen, damit jeder es besser verstehen kann. Lass uns einen Blick darauf werfen!
Ich möchte einige Strukturfelder im vom Golang-Modul generierten Eingabeaufforderungsmuster zusätzlich einschränken.
Das Folgende schema.cue
wird aus dem entsprechenden Golang-Modul generiert
package app #App: { version: string @go(Version) } ...
Ich habe versucht, Hinweisanmerkungen im Golang-Quellmodul anzugeben (Beispiel unten), aber dies führte nicht zu den richtigen Einschränkungen im generierten schema.cue
.
type App struct { Version string `cue:"'version: =~core.myapp.dev/v1'" yaml:"Version"` }
Ein anderer Ansatz, den ich ausprobiert habe, bestand darin, Konjunktionen zu verwenden, um Instanzen des Schemas zu erweitern.
CB79515A7EDA1BA1F8290B9FA56F2A98Aber, cue vet schema.cue测试/badVersionValue.yaml
,并没有对stdout
产生任何错误,其中badVersionValue.yaml
包含Version:badstring
.
Mit dem folgenden manuell geschriebenen Text konnte ich eine funktionierende Lösung finden schema.cue
package app version: =~"core.myapp.dev/v1"
Das cue vet schema.cuetests/badVersionValue.yaml
wird produzieren
Version: invalid value "badstring" (out of bound =~"core.myapp.dev/v1"): ...
Der Nachteil dieses Ansatzes besteht darin, dass ich die Hinweismusterdatei von Grund auf neu schreiben würde, anstatt eine Datei zu verwenden und zu iterieren, die aus dem Golang-Quellcode/der Quelle der Wahrheit generiert wurde.
Ich habe falsch verstanden, wie man Eingabeaufforderungen für Bewertungen richtig verwendet, wenn es um definitions
ging.
Basierend auf diesem Beispiel von cuetorials.com können Sie angeben, wo -d “#Schema”
sich befindet
Ich sehe nicht nur Folgendes erfolgreich, wo sich der Inhalt der Yaml-Datei befindet Version: 5
.
cue vet badVersionStr.yaml schema.cue -d '#App' Version: conflicting values 5 and string (mismatched types int and string):
Und fügen Sie auch Einschränkungen an vorhandene Felder gemäß OP hinzu:
package app #App: { version: string @go(Version) version: =~ "core.myapp.dev/v1" } ...
Erzeugt jetzt die erwartete Ausgabe
cue vet badVersionStr.yaml schema.cue -d '#App' Version: invalid value "badString" (out of bound =~"core.myapp.dev/v1"):
Bearbeiten: Dies ist ein besserer Ansatz für Leute, die Golang-Module für alles verwenden. Sie können Einschränkungen als Strukturfeldanmerkungen in Golang-Modulen platzieren.
# app.go type App struct { Version string `cue:"=~\"core.myapp.dev/v1\"" yaml:"Version"` ...
Verwenden Sie cue get go app.go
你会得到一个相应的 app_go_gen.cue
, es sollte so aussehen
#App: { Version: string & =~"core.myapp.dev/v1" @go(Version) ...
Dies funktioniert, wenn der oben genannte cue vet ...
-Befehl ausgeführt wird. Das bedeutet, dass Sie im Golang-Modul nur Einschränkungen angeben und dann ein Cue-Schema generieren müssen, das diese Anmerkungen als Einschränkungen für die Strukturfelder interpretiert.
Das obige ist der detaillierte Inhalt vonWie man mit Cuelang eine Bedingung auf ein Strukturfeld eines von einem Golang-Modul generierten Hinweismusters setzt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!