GO를 사용한 Protobuf
프로토콜 버퍼란?
프로토콜 버퍼는 직렬화 및 역직렬화할 수 있는 구조화된 데이터를 저장하는 JSON 및 XML과 같은 데이터 형식입니다. Google에서 개발한 데이터 형식입니다. Protobuf의 주요 장점은 다른 형식보다 훨씬 작다는 것입니다.
Protobuf is 3 to 10 times smaller and 20 to 100 times faster than XML.
이제 축구 경기를 예로 들어 XML, JSON 및 Protobuf로 데이터를 표현해 보겠습니다.
XML:
<game>
<home>Real Madrid</home>
<away>Barcelona</away>
<venue>Santiago Bernabéu Stadium</venue>
<date>26-10-2019</date>
</game>
JSON:
{
"home": "Real Madrid",
"away": "Barcelona",
"venue": "Santiago Bernabéu Stadium",
"date": "26-10-2019"
}
프로토버프:
[10 11 82 101 97 108 32 77 97 100 114 105 100 18 9 66 97 114 99 101 108 111 110 97 26 26 83 97 110 116 105 97 103 111 32 66 101 114 110 97 98 195 169 117 32 83 116 97 100 105 117 109 34 10 50 54 45 49 48 45 50 48 49 57]
위에 표시된 protobuf 형식은 배열의 위치 2에서 시작하는 문자열의 인코딩된 바이트입니다. 문자열 "Real Madrid"는 R = 82, e = 101 등으로 표기됩니다.
이 인코딩에 대해 알아보려면 여기에서 Google 자체 문서를 확인하십시오. Proton Buffer Encoding .
이 규모에서 크기는 대부분 비슷합니다. 그러나 더 큰 데이터로 확장하면 크기가 큰 차이를 보이기 시작합니다.
이제 Protobuf를 Go 코드로 가져와 보겠습니다.
패키지 설치
➜ go_workspace go get github.com/golang/protobuf
➜ go_workspace go get github.com/golang/protobuf/proto
➜ go_workspace go get -u github.com/golang/protobuf/protoc-gen-go
➜ go_workspace export PATH=$PATH:$GOPATH/bin
그러면 필요한 패키지가 설치되고 이제 준비가 되었습니다.
이제 게임 개체에 대한 protobuf를 정의해 보겠습니다.
Game.proto
syntax = "proto3";
package main;
message Game {
string home = 1;
string away = 2;
string venue = 3;
string date = 4;
}
proto의 버전 구문을 지정하는 것으로 시작합니다. 여기에서는 구문을 'proto3'로 설정합니다. 다음으로 이 개체를 사용할 패키지를 정의합니다. 그런 다음 Game 개체의 형식을 정의합니다. 이것은 다음과 같은 필드, 홈, 어웨이, 장소 및 날짜를 특징으로 하는 게임 유형의 메시지 형식으로 구성됩니다.
proto 파일을 정의했으므로 protoc과 함께 컴파일할 것입니다.
➜ go_workspace/src protoc --go_out=. *.proto
이렇게 하면 자동 생성 코드가 포함된 game.pb.go 파일이 생성됩니다. 이 코드에 대한 자세한 내용은 Google 문서를 확인하십시오. Go generated code .
main.go
package main
import (
fmt "fmt"
"log"
proto "github.com/golang/protobuf/proto"
)
func main() {
elClasico := &Game{
Home: "Real Madrid",
Away: "Barcelona",
Venue: "Santiago Bernabéu Stadium",
Date: "26-10-2019",
}
data, err := proto.Marshal(elClasico)
if err != nil {
log.Fatal("Marshaling error: ", err)
}
fmt.Println(data)
newElClasico := &Game{}
err = proto.Unmarshal(data, newElClasico)
if err != nil {
log.Fatal("UnMarshaling error: ", err)
}
fmt.Println(newElClasico.GetHome())
fmt.Println(newElClasico.GetAway())
fmt.Println(newElClasico.GetVenue())
fmt.Println(newElClasico.GetDate())
}
위의 코드에서는 game.pb.go에 정의된 Game 구조체를 사용하여 elClasico 개체에 세부 정보를 추가합니다. proto 라이브러리의 Marshal 함수를 사용하여 개체를 Protobuf 형식으로 변환합니다. 그런 다음 인코딩된 바이트는 Unmarshal 함수로 디코딩할 수 있습니다. 이제 game.pb.go 파일에서 생성된 GetHome, GetAway 함수를 사용하여 디코딩된 개체에서 값을 가져올 수 있습니다.
➜ go_workspace/src go run main.go game.pb.go
[10 11 82 101 97 108 32 77 97 100 114 105 100 18 9 66 97 114 99 101 108 111 110 97 26 26 83 97 110 116 105 97 103 111 32 66 101 114 110 97 98 195 169 117 32 83 116 97 100 105 117 109 34 10 50 54 45 49 48 45 50 48 49 57]
Home: Real Madrid
Away: Barcelona
Venue: Santiago Bernabéu Stadium
Date: 26-10-2019
game.pb.go를 포함하는 것을 잊지 마세요. 이제 우리는 작은 예제를 실행하고 있습니다. 그러나 실제로 현실 세계에서는 데이터가 이렇게 간단하지 않을 것입니다. 이제 일부 중첩된 필드를 살펴보겠습니다.
동일한 Game 개체를 사용합니다. 여기에서 우리는 필드를 집으로 가져가서 목표 팀으로 만들고 있습니다.
game.proto:
syntax = "proto3";
package main;
message Team {
string home = 1;
string away = 2;
}
message Game {
Team team = 1;
string venue = 2;
string date = 3;
}
다시 자동 생성 코드를 생성합니다.
➜ go_workspace/src protoc --go_out=. *.proto
그리고 이에 따라 main.go 파일을 업데이트합니다.
main.go
package main
import (
fmt "fmt"
"log"
proto "github.com/golang/protobuf/proto"
)
func main() {
elClasico := &Game{
Venue: "Santiago Bernabéu Stadium",
Date: "26-10-2019",
Team: &Team{
Home: "Real Madrid",
Away: "Barcelona",
},
}
data, err := proto.Marshal(elClasico)
if err != nil {
log.Fatal("marshaling error: ", err)
}
fmt.Println(data)
newElClasico := &Game{}
err = proto.Unmarshal(data, newElClasico)
if err != nil {
log.Fatal("unmarshaling error: ", err)
}
fmt.Println("Home: ", newElClasico.Team.GetHome())
fmt.Println("Away: ", newElClasico.Team.GetAway())
fmt.Println("Venue: ", newElClasico.GetVenue())
fmt.Println("Date: ", newElClasico.GetDate())
}
이제 프로그램을 실행하면.
➜ go_workspace/src go run main.go game.pb.go
[10 24 10 11 82 101 97 108 32 77 97 100 114 105 100 18 9 66 97 114 99 101 108 111 110 97 18 26 83 97 110 116 105 97 103 111 32 66 101 114 110 97 98 195 169 117 32 83 116 97 100 105 117 109 26 10 50 54 45 49 48 45 50 48 49 57]
Home: Real Madrid
Away: Barcelona
Venue: Santiago Bernabéu Stadium
Date: 26-10-2019
흥미롭지 않나요?
좋습니다. 이제 Go에서 프로토콜 버퍼 데이터 형식을 사용하는 방법을 알았습니다. 지금은 그게 다야. 또 다른 흥미로운 주제로 여러분을 다시 뵙겠습니다.
Reference
이 문제에 관하여(GO를 사용한 Protobuf), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/heerthees/protobuf-with-go-4hb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)