Input (.proto-skema)

Output (Go)

Hvad det her værktøj gør

Go er protobufs hjemmesprog — de fleste gRPC-tjenester i produktion er skrevet i det. Normalt genererer du Go ud fra .proto med protoc-gen-go eller buf, hvilket betyder at installere toolchainen, konfigurere en generator og køre et build-skridt. Denne konverter gør det samme job i din browser — indsæt, kopiér, smid i dit repo.

Type-mappingen følger det, som protoc-gen-go spytter ud: stringstring, boolbool, bytes[]byte, heltals-typerne mappes til deres int32/int64/uint32/uint64-modstykker (ingen præcisionstab som i JavaScript), doublefloat64, floatfloat32. Singulære message-felter er pointers (matchende konventionen i de officielle Go-protobuf-bindings), repeated T bliver []T, map<K, V> bliver map[K]V.

Feltnavne får den Go-kanoniske PascalCase-behandling, med almindelige akronymer i versaler (order_idOrderID, api_urlAPIURL) ifølge Go review style. Hvert felt får klar-til-brug struct-tags: protobuf:"varint,3,opt,name=status,proto3" til wire-formatet og json:"status,omitempty" til JSON-marshalling. Konverteringen er lokal — dit .proto forlader aldrig browseren. Til produktionskode bør du stadig køre rigtig codegen for at få metoder, descriptors og reflection-rørlæggeri — men til skitser, reviews og engangs-scripts er det her hurtigere.

Sådan bruger du det

Tre skridt. Outputtet er indsæt-klar Go, der kompilerer som det er med standardbiblioteket.

1

Indsæt dit .proto-skema

Smid skemaet i den venstre editor. syntax = "proto3"; i toppen er fint men valgfrit. Parseren håndterer nestede message-blokke, enum-deklarationer, oneof, map<K, V> og feltoptions. Imports genkendes men springes over.

Feltnavne konverterer automatisk fra snake_case til PascalCase. Konverteren versaliserer almindelige akronym-endelser (IdID, UrlURL) så outputtet passerer revive / golint uden brok.

2

Læs outputtet

Til højre: Go med én type X struct per message og en type X int32 + const-blok per enum. package proto i toppen er en pladsholder — skift den til dit rigtige pakkenavn.

3

Sæt det ind i dit projekt

Smid filen i dit projekt, ret package-deklarationen og importér. Til rigtig gRPC-kode vil du stadig gerne køre protoc-gen-go for at få marshal/unmarshal-metoderne. Det her output er tænkt til typet JSON-håndtering, struct-skitser og reviews — protobufs wire-format-metoder genereres ikke her.

Hvornår det reelt sparer tid

Skitsere en Go-tjeneste ud fra et eksisterende .proto

Du sætter en Go-tjeneste op, der forbruger Protobuf-meddelelser fra et andet team. Du vil have struct-formerne til handler-signaturer og JSON-svar uden at sætte hele codegen-pipelinen op. Indsæt, smid i types.go, du er typet.

Reviewe en Protobuf-API-ændring for en Go-forbruger

En backend-kollega tilføjede felter til et message. Indsæt det nye .proto, diff Go-outputtet mod dit nuværende types.go, efterlad en fokuseret review. Hurtigere end at fyre toolchainen op bare for at se på ændringen.

Sanity check på tværs af sprog

Du har et .proto, der forbruges af både Go- og TypeScript-klienter. Brug det her side om side med Protobuf til TypeScript-konverteren for at bekræfte at begge sprog vil se kompatible feltnavne og typer efter JSON-kodning.

Engangs-integrationsscripts

Du skriver et 50-linjers Go-script, der rammer en gRPC-gateway-endpoint. At sætte protoc, buf og en generator-config op til ét script er overkill. Generér structs her, smid dem ind, send scriptet ud.

Almindelige spørgsmål

Er det her en erstatning for protoc-gen-go?

Nej. protoc-gen-go spytter de binære marshal/unmarshal-metoder, file-descriptors og reflection-rørlæggeri ud, der skal til for rigtig gRPC. Denne konverter spytter kun struct-formerne og tags ud. Skriver du en rigtig gRPC-tjeneste, så kør den officielle codegen. Hvis du bare har brug for typer til JSON-svar, håndlavede scripts eller skitser — det her er hurtigere.

Hvorfor er message-typede felter pointers?

Det spejler det, protoc-gen-go gør med proto3 message-felter — de er pointers, så zero value er nil (kan skelnes fra et tilstedeværende men tomt message). Skalære felter forbliver værdier, fordi deres zero values selv er gyldige (tom streng, 0, false). Hvis du af en eller anden grund foretrækker ikke-pointer, så lav find-replace på stjernerne i outputtet.

Hvordan udsendes enums?

Som Go-int32-typedefs med en const-blok, i tråd med protoc-gen-gos konventioner. Hver enum-værdi bliver til en PascalCase Go-konstant af den type. De numeriske tildelinger kommer direkte fra .proto.

Hvad med protobufs struct-tags?

Hvert felt får et protobuf:"..."-tag med wire-typen (varint, fixed32, fixed64, bytes), feltnummer, label (opt/rep), navn og proto3-markør. Plus et json:"name,omitempty"-tag, der bruger det oprindelige snake_case-navn. map<K, V>-tags er forenklede — for streng wire-format-kompatibilitet, kør rigtig codegen.

Hvordan konverteres feltnavne?

snake_casePascalCase, med almindelige akronym-endelser i versaler: order_idOrderID, api_urlAPIURL, data_jsonDataJSON. Det matcher Go review-stilens konventioner, så outputtet passerer lint uden manuel oprydning.

Hvad hvis mit skema importerer et andet .proto?

import-sætninger genkendes og springes over — message-typer på tværs af filer renderes med deres bladnavn (foo.BarBar), som Go ikke vil kunne resolve, medmindre den type også eksisterer i samme pakke. Du kan enten indsætte de importerede messages inline eller forvente at rette referencerne i outputtet.

Relaterede værktøjer

Hvis du arbejder med Protobuf, JSON og Go, så fungerer disse godt sammen: