Protobuf zu Go Konverter
Fügen Sie ein .proto-Schema ein. Bekommen Sie Go-Structs mit korrekten Typen, Struct-Tags und Pointern für verschachtelte Messages — bereit zum Einfügen in Ihr Repo.
Eingabe (.proto-Schema)
Ausgabe (Go)
Was dieses Tool macht
Go ist die protobuf-native Sprache — die meisten gRPC-Services in Produktion sind darin geschrieben. Normalerweise generieren Sie Go aus .proto mit protoc-gen-go oder buf — was bedeutet, dass Sie die Toolchain installieren, einen Generator konfigurieren und einen Build-Schritt ausführen müssen. Dieser Konverter erledigt dasselbe in Ihrem Browser — einfügen, kopieren, ins Repo legen.
Das Type-Mapping folgt dem, was protoc-gen-go ausgibt: string → string, bool → bool, bytes → []byte, die Integer-Typen werden auf ihre int32/int64/uint32/uint64-Pendants gemappt (kein Präzisionsverlust wie in JavaScript), double → float64, float → float32. Singuläre Message-Felder sind Pointer (passend zur Konvention der offiziellen Go-Protobuf-Bindings), repeated T wird zu []T, map<K, V> wird zu map[K]V.
Feldnamen bekommen die Go-kanonische PascalCase-Behandlung, mit gängigen Akronymen in Großbuchstaben (order_id → OrderID, api_url → APIURL) gemäß Go Review Style. Jedes Feld bekommt einsatzbereite Struct-Tags: protobuf:"varint,3,opt,name=status,proto3" fürs Wire-Format und json:"status,omitempty" fürs JSON-Marshalling. Die Konvertierung ist lokal — Ihr .proto verlässt den Browser nie. Für Produktionscode sollten Sie trotzdem echtes Codegen laufen lassen, um Methoden, Descriptors und Reflection-Unterbau zu bekommen — aber für Skizzen, Reviews und einmalige Skripte ist das hier schneller.
Wie man es benutzt
Drei Schritte. Die Ausgabe ist einsatzbereiter Go-Code, der so wie er ist mit der Standardbibliothek kompiliert.
Fügen Sie Ihr .proto-Schema ein
Werfen Sie das Schema in den linken Editor. syntax = "proto3"; oben ist OK aber optional. Der Parser kommt mit verschachtelten message-Blöcken, enum-Deklarationen, oneof, map<K, V> und Feldoptionen klar. Imports werden erkannt, aber übersprungen.
Feldnamen werden automatisch von snake_case zu PascalCase konvertiert. Der Konverter schreibt gängige Akronym-Suffixe groß (Id → ID, Url → URL), damit die Ausgabe revive / golint ohne Beschwerden passiert.
Lesen Sie die Ausgabe
Rechts: Go mit einem type X struct pro Message und einem type X int32-+const-Block pro Enum. package proto oben ist ein Platzhalter — ändern Sie ihn auf Ihren tatsächlichen Paketnamen.
In Ihr Projekt einbauen
Werfen Sie die Datei in Ihr Projekt, korrigieren Sie die package-Deklaration und importieren Sie. Für echten gRPC-Code werden Sie trotzdem protoc-gen-go laufen lassen wollen, um die Marshal/Unmarshal-Methoden zu bekommen. Diese Ausgabe ist für getypte JSON-Verarbeitung, Struct-Skizzen und Reviews gedacht — die Protobuf-Wire-Format-Methoden werden hier nicht generiert.
Wann das wirklich Zeit spart
Einen Go-Service aus einem bestehenden .proto skizzieren
Sie ziehen einen Go-Service hoch, der Protobuf-Nachrichten von einem anderen Team konsumiert. Sie wollen die Struct-Formen für Handler-Signaturen und JSON-Antworten, ohne die volle Codegen-Pipeline aufzusetzen. Einfügen, ab in types.go, Sie sind getypt.
Eine Protobuf-API-Änderung für einen Go-Konsumenten reviewen
Ein Backend-Kollege hat einer Message Felder hinzugefügt. Fügen Sie das neue .proto ein, diffen Sie die Go-Ausgabe gegen Ihre aktuelle types.go, hinterlassen Sie ein fokussiertes Review. Schneller, als die Toolchain hochzufahren, nur um die Änderung anzuschauen.
Sanity-Check zwischen Sprachen
Sie haben ein .proto, das sowohl von Go- als auch TypeScript-Clients konsumiert wird. Nutzen Sie das Tool nebeneinander mit dem Protobuf zu TypeScript-Konverter, um zu bestätigen, dass beide Sprachen nach dem JSON-Encoding kompatible Feldnamen und -typen sehen.
Einmalige Integrationsskripte
Sie schreiben ein 50-Zeilen-Go-Skript, das einen gRPC-Gateway-Endpunkt anspricht. protoc, buf und eine Generator-Konfiguration für ein einzelnes Skript einzurichten ist Overkill. Generieren Sie die Structs hier, fügen Sie sie ein, schicken Sie das Skript raus.
Häufige Fragen
Ist das ein Ersatz für protoc-gen-go?
Nein. protoc-gen-go gibt die binären Marshal/Unmarshal-Methoden, File-Descriptors und den Reflection-Unterbau aus, die für echtes gRPC nötig sind. Dieser Konverter gibt nur die Struct-Formen und Tags aus. Wenn Sie einen echten gRPC-Service schreiben, lassen Sie das offizielle Codegen laufen. Wenn Sie nur Typen für JSON-Antworten, handgeschriebene Skripte oder Skizzen brauchen — das hier ist schneller.
Warum sind Felder mit Message-Typ Pointer?
Es spiegelt wider, was protoc-gen-go bei proto3-Message-Feldern macht — sie sind Pointer, damit der Zero Value nil ist (unterscheidbar von einer vorhandenen aber leeren Message). Skalare Felder bleiben Werte, weil ihre Zero Values selbst gültig sind (leerer String, 0, false). Wenn Sie aus irgendeinem Grund Nicht-Pointer bevorzugen, machen Sie ein Find-Replace auf die Sterne in der Ausgabe.
Wie werden Enums ausgegeben?
Als Go-int32-Typdefinitionen mit einem const-Block, passend zu den protoc-gen-go-Konventionen. Jeder Enum-Wert wird zu einer PascalCase-Go-Konstante dieses Typs. Die numerischen Zuweisungen kommen direkt aus dem .proto.
Was ist mit den protobuf-Struct-Tags?
Jedes Feld bekommt einen protobuf:"..."-Tag mit Wire-Typ (varint, fixed32, fixed64, bytes), Feldnummer, Label (opt/rep), Namen und proto3-Marker. Plus einen json:"name,omitempty"-Tag mit dem ursprünglichen snake_case-Namen. map<K, V>-Tags sind vereinfacht — für strikte Wire-Format-Kompatibilität lassen Sie echtes Codegen laufen.
Wie werden Feldnamen konvertiert?
snake_case → PascalCase, mit gängigen Akronym-Suffixen in Großbuchstaben: order_id → OrderID, api_url → APIURL, data_json → DataJSON. Das passt zu den Konventionen des Go-Review-Styles, sodass die Ausgabe ohne manuelle Aufräumarbeit durch den Linter geht.
Was, wenn mein Schema ein anderes .proto importiert?
import-Anweisungen werden erkannt und übersprungen — Message-Typen aus anderen Dateien werden mit ihrem Blattnamen gerendert (foo.Bar → Bar), den Go nicht auflösen kann, sofern dieser Typ nicht ebenfalls im selben Paket existiert. Entweder fügen Sie die importierten Messages inline ein oder rechnen damit, die Referenzen in der Ausgabe noch zu reparieren.
Verwandte Tools
Wenn Sie mit Protobuf, JSON und Go arbeiten, passen diese gut zusammen: