>백엔드 개발 >Golang >Go 언어의 프로토콜 버퍼와 인코딩 및 디코딩 기술

Go 언어의 프로토콜 버퍼와 인코딩 및 디코딩 기술

WBOY
WBOY원래의
2023-06-01 09:22:531501검색

Go 언어는 널리 사용되는 정적인 유형의 프로그래밍 언어로, 특히 고성능, 동시성 네트워크 애플리케이션 개발에 적합합니다. 웹 애플리케이션에서는 정보가 여러 시스템 간에 특정 형식으로 교환되어야 하기 때문에 데이터 직렬화 및 역직렬화는 매우 중요합니다.

Go 언어는 Google이 개발했으며 분산 시스템에서 데이터 교환에 널리 사용되는 프로토콜 버퍼라는 경량 데이터 교환 형식을 제공합니다. 프로토콜 버퍼는 데이터 전송 효율성을 크게 향상시키고 개발자의 작업량을 줄일 수 있는 언어 및 플랫폼 독립적인 바이너리 데이터 형식입니다.

이 기사에서는 독자가 이 기능을 더 잘 이해하고 사용하여 네트워크 애플리케이션 개발을 단순화할 수 있도록 Go 언어의 프로토콜 버퍼와 인코딩 및 디코딩 기술을 살펴보겠습니다.

프로토콜 버퍼

프로토콜 버퍼는 간단한 인터페이스를 사용하여 데이터 구조를 설명하고 인코딩을 통해 데이터를 바이너리 형식으로 직렬화하는 경량 데이터 교환 형식입니다. 프로토콜 버퍼는 네트워크 애플리케이션에서 서로 다른 시스템 간에 데이터를 교환하는 데 자주 사용됩니다. 주요 장점은 다음과 같습니다.

  • 언어 독립적: 프로토콜 버퍼는 여러 프로그래밍 언어를 지원하며 해당 설명 파일은 텍스트 형식으로 표시됩니다.
  • 컴팩트함: 프로토콜 버퍼의 인코딩은 매우 컴팩트하므로 데이터 전송 중 네트워크 대역폭 사용을 크게 줄일 수 있습니다.
  • 확장성: 프로토콜 버퍼는 기존 구문 분석 코드에 영향을 주지 않고 데이터 구조 변경을 지원합니다.

다음은 프로토콜 버퍼 사용의 간단한 예입니다.

프로토콜 버퍼 형식 파일 정의

프로토콜 버퍼 형식 파일은 .proto 파일 확장자로 표시되는 텍스트 파일입니다. 예를 들어, 다음 .proto 파일은 Name이라는 문자열 필드와 Age라는 정수 필드를 포함하는 간단한 메시지를 정의합니다.

syntax = "proto3";

message Person {
  string Name = 1;
  int32 Age = 2;
}

프로토콜 버퍼 형식 파일을 정의하면 데이터 및 유형의 구조를 설명하고 코드를 생성할 수 있습니다. 데이터 직렬화 및 역직렬화를 위한 것입니다.

Go 언어 코드 생성

.proto 파일을 정의한 후 protoc 도구를 사용하여 Go 언어 코드로 컴파일해야 합니다. 먼저 protoc 도구를 설치해야 합니다.

$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.8/protoc-3.15.8-linux-x86_64.zip
$ unzip protoc-3.15.8-linux-x86_64.zip -d protoc3
$ sudo mv protoc3/bin/* /usr/local/bin/
$ sudo mv protoc3/include/* /usr/local/include/

그런 다음 다음 명령을 사용하여 Go 언어 코드를 생성할 수 있습니다.

$ protoc --go_out=. person.proto

생성된 Go 언어 코드는 다음과 같습니다.

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: person.proto

package main

import (
  "fmt"
  "proto"
  "bufio"
  "os"
)

func main() {
  person := &proto.Person{Name: "John", Age: 30}

  // Encode to binary format
  data, err := proto.Marshal(person)
  if err != nil {
    fmt.Println("Error:", err)
  }

  // Decode from binary format
  newPerson := &proto.Person{}
  err = proto.Unmarshal(data, newPerson)
  if err != nil {
    fmt.Println("Error:", err)
  }

  fmt.Println("Name:", newPerson.Name)
  fmt.Println("Age:", newPerson.Age)
}

위 예에서 우리는 먼저 Person 구조 본문 객체를 만들고 해당 필드를 채웁니다. 그런 다음 개체를 이진 형식으로 직렬화하고 이를 데이터 변수에 저장합니다. 마지막으로 이를 새로운 Person 구조 객체로 역직렬화하고 인쇄합니다.

코딩 및 디코딩 기술

프로토콜 버퍼를 사용할 때 이 기능을 더 잘 사용하려면 몇 가지 기본적인 코딩 및 디코딩 기술을 숙달해야 합니다. 아래에는 몇 가지 인코딩 및 디코딩 팁이 나열되어 있습니다.

  1. 형식 변환

메시지를 바이너리 형식으로 직렬화하기 전에 일부 필드를 다른 형식으로 변환해야 할 수도 있습니다. 예를 들어 문자열을 바이트 배열로 변환하고 숫자를 고정 길이 문자열로 변환해야 할 수도 있습니다. 이를 바이너리 형식으로 변환한 후 동일한 기술을 사용하여 원래 형식으로 복원할 수 있습니다.

  1. 다중 메시지

프로토콜 버퍼는 여러 메시지를 동일한 바이너리 배열로 직렬화하는 것을 지원합니다. 이는 일반적으로 여러 소켓을 만드는 오버헤드를 피하기 위해 여러 메시지를 보내는 데 사용됩니다. 디코딩할 때 전체 바이너리 배열을 반복하여 여러 메시지로 분할해야 합니다.

  1. 선택적 필드

프로토콜 버퍼는 특정 필드를 선택적으로 표시하는 것을 지원합니다. 이러한 필드는 존재하지 않을 수 있습니다. 필드가 존재하지 않으면 기본값이 대신 사용됩니다. 코딩하는 동안 각 선택적 필드가 존재하는지 확인하고 존재하는 경우에만 이진 배열로 직렬화해야 합니다. 디코딩할 때 각 필드가 존재하는 것으로 표시되었는지 확인하고 존재하는 경우에만 메시지 객체로 복원해야 합니다.

결론

이 기사에서는 Go 언어의 프로토콜 버퍼와 인코딩 및 디코딩 기술을 소개했습니다. 프로토콜 버퍼를 사용하면 서로 다른 시스템 간에 데이터를 보다 쉽게 ​​교환할 수 있으며 네트워크 애플리케이션의 성능과 효율성을 크게 향상시킬 수 있습니다. 또한 실제 애플리케이션에서 프로토콜 버퍼를 더 잘 사용하는 데 도움이 되는 몇 가지 기본 인코딩 및 디코딩 기술을 소개했습니다. 독자들이 이 기사를 통해 프로토콜 버퍼와 인코딩 및 디코딩 기술에 대해 더 깊이 이해하고 이러한 기술을 사용하여 보다 효율적이고 안정적인 네트워크 응용 프로그램을 개발할 수 있기를 바랍니다.

위 내용은 Go 언어의 프로토콜 버퍼와 인코딩 및 디코딩 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.