Girdi (.proto şeması)

Çıktı (Go)

Bu aracın yaptığı iş

Go, protobuf’un yerel dilidir — üretimdeki gRPC servislerinin çoğu Go ile yazılır. Normalde .proto’dan Go üretmek için protoc-gen-go ya da buf kullanırsınız; yani toolchain’i kurarsınız, bir generator yapılandırırsınız ve bir build adımı çalıştırırsınız. Bu dönüştürücü aynı işi tarayıcınızda yapıyor — yapıştır, kopyala, repo’na bırak.

Tip eşleştirmesi protoc-gen-go’nun ürettiğini izler: stringstring, boolbool, bytes[]byte, tamsayı tipleri kendi int32/int64/uint32/uint64 karşılıklarına eşlenir (JavaScript’teki gibi hassasiyet kaybı yoktur), doublefloat64, floatfloat32. Tekil mesaj alanları pointer’dır (resmi Go protobuf binding’lerinin kuralına uyarak), repeated T[]T olur, map<K, V>map[K]V olur.

Alan adları Go review stilina göre Go’nun standart PascalCase muamelesini görür ve yaygın kısaltmalar büyük harfe çevrilir (order_idOrderID, api_urlAPIURL). Her alan, kullanıma hazır struct tag’leri alır: wire format için protobuf:"varint,3,opt,name=status,proto3" ve JSON marshalling için json:"status,omitempty". Dönüşüm yereldir — .proto dosyanız tarayıcıdan çıkmaz. Üretim kodunda metodlar, descriptor’lar ve reflection donanımı için yine de gerçek codegen çalıştırmanız gerekir; ama taslaklar, review’lar ve tek seferlik script’ler için bu daha hızlıdır.

Nasıl kullanılır

Üç adım. Çıktı, standart kütüphaneyle olduğu gibi derlenen yapıştırmaya hazır Go kodudur.

1

.proto şemanızı yapıştırın

Şemayı soldaki editöre bırakın. Üstte syntax = "proto3"; olabilir, ama opsiyoneldir. Parser; iç içe message bloklarını, enum bildirimlerini, oneof’u, map<K, V>’yi ve alan opsiyonlarını işler. Import’lar tanınır ama atlanır.

Alan adları snake_case’den PascalCase’e otomatik dönüşür. Dönüştürücü, yaygın kısaltma soneklerini büyük harfe çevirir (IdID, UrlURL) ki çıktı revive / golint’ten şikayet görmeden geçsin.

2

Çıktıyı okuyun

Sağda: her mesaj için bir type X struct ve her enum için bir type X int32 + const bloğu içeren Go kodu. Üstteki package proto bir yer tutucudur — gerçek paket adınızla değiştirin.

3

Projenize bağlayın

Dosyayı projenize bırakın, package bildirimini düzeltin ve import edin. Gerçek gRPC kodu için marshal/unmarshal metodlarını almak için yine protoc-gen-go çalıştırmak isteyeceksiniz. Bu çıktı; tipli JSON işleme, struct taslakları ve review’lar için tasarlanmıştır — protobuf wire format metodları burada üretilmez.

Gerçekten zaman kazandırdığı durumlar

Mevcut bir .proto’dan Go servisi taslaklamak

Başka bir takımdan Protobuf mesajları tüketen bir Go servisini iskele halinde kuruyorsunuz. Tüm codegen pipeline’ını kurmadan, handler imzaları ve JSON yanıtları için struct şekillerini istiyorsunuz. Yapıştırın, types.go’ya bırakın, tipliyiz.

Go tüketicisi için bir Protobuf API değişikliğini incelemek

Backend takım arkadaşı bir mesaja alanlar ekledi. Yeni .proto’yu yapıştırın, Go çıktısını mevcut types.go’nuzla diff’leyin, odaklı bir review bırakın. Sırf değişikliğe bakmak için toolchain’i ayağa kaldırmaktan hızlıdır.

Diller arası akıl sağlığı kontrolü

Hem Go hem TypeScript istemcileri tarafından tüketilen bir .proto’nuz var. JSON kodlamasından sonra her iki dilin uyumlu alan adı ve tipleri göreceğini doğrulamak için bunu Protobuf TypeScript dönüştürücüyle yan yana kullanın.

Tek seferlik entegrasyon script’leri

Bir gRPC-gateway uç noktasına vuran 50 satırlık bir Go script’i yazıyorsunuz. Bir script için protoc, buf ve generator yapılandırması kurmak fazla. Struct’ları burada üretin, içine atın, script’i sevk edin.

Sık sorulan sorular

Bu, protoc-gen-go’nun yerine geçer mi?

Hayır. protoc-gen-go; gerçek gRPC için gereken ikili marshal/unmarshal metodlarını, dosya descriptor’larını ve reflection donanımını üretir. Bu dönüştürücü yalnızca struct şekillerini ve tag’leri üretir. Gerçek bir gRPC servisi yazıyorsanız resmi codegen’i çalıştırın. Sadece JSON yanıtları, elle yazılan script’ler ya da taslaklar için tip lazımsa — bu daha hızlı.

Mesaj tipli alanlar neden pointer?

protoc-gen-go’nun proto3 mesaj alanları için yaptığını yansıtır — pointer olduklarından zero value nil’dir (var olan ama boş bir mesajdan ayırt edilebilir). Skaler alanlar değer olarak kalır çünkü zero value’ları kendi başlarına geçerlidir (boş string, 0, false). Bir nedenle pointer olmamasını isterseniz çıktıdaki yıldızları find-replace ile değiştirin.

Enum’lar nasıl üretiliyor?

protoc-gen-go geleneklerine uygun şekilde, Go int32 typedef’leri ve bir const bloğu olarak. Her enum değeri o tipin PascalCase Go sabitine dönüşür. Sayısal atamalar doğrudan .proto’dan gelir.

Protobuf struct tag’leri nasıl?

Her alan; wire type (varint, fixed32, fixed64, bytes), alan numarası, label (opt/rep), ad ve proto3 işaretiyle bir protobuf:"..." tag’i alır. Ayrıca orijinal snake_case adı kullanan bir json:"name,omitempty" tag’i. map<K, V> tag’leri sadeleştirilmiştir — sıkı wire-format uyumluluğu için gerçek codegen çalıştırın.

Alan adları nasıl dönüştürülüyor?

snake_casePascalCase, yaygın kısaltma sonekleri büyük harfe çevrilir: order_idOrderID, api_urlAPIURL, data_jsonDataJSON. Bu, Go review stili kurallarıyla eşleşir; çıktı, elle temizlik gerekmeden lint’ten geçer.

Şemam başka bir .proto’yu import ediyorsa?

import deyimleri tanınır ve atlanır — dosyalar arası mesaj tipleri yaprak adlarıyla render edilir (foo.BarBar); o tip aynı pakette de bulunmadıkça Go bunu çözemez. Ya import edilen mesajları satır içinde yapıştırın ya da çıktıdaki referansları sonradan düzelteceğinizi kabul edin.

İlgili araçlar

Protobuf, JSON ve Go ile çalışıyorsanız bunlar iyi bir ikili oluşturur: