Go에서 알 수 없는 프로토콜 버퍼 언마샬링
프로토콜 버퍼(protobuf)로 작업할 때 수신된 메시지 유형이 다음과 같은 상황에 직면할 수 있습니다. 알려지지 않았습니다. 이는 여러 소스에서 메시지를 수신할 때 또는 동적이거나 예측할 수 없는 메시지 유형을 처리할 때 발생할 수 있습니다.
Protobuf의 기본 Unmarshal 함수는 특정 메시지 유형을 인수로 전달해야 하지만 메시지가 유형을 알 수 없습니다. 일반적인 접근 방식은 인터페이스로 역마샬링을 시도하는 것입니다{}. 그러나 이는 Protobuf 라이브러리에서 지원되지 않습니다.
제한 사항 해결
알 수 없는 메시지를 처리하려면, 사용자 정의 접근 방식을 구현해야 합니다. 한 가지 해결책은 protobuf 메시지의 와이어 표현에 대한 낮은 수준의 액세스를 제공하는 protowire 패키지를 사용하는 것입니다.
알 수 없는 메시지 구문 분석
다음 코드 조각은 방법을 보여줍니다. 알 수 없는 protobuf 메시지에서 정보를 구문 분석하고 추출하려면:
type Field struct { Tag Val } type Tag struct { Num int32 Type protowire.Type } type Val struct { Payload interface{} Length int } func parseUnknown(b []byte) []Field { // ... }
parseUnknown 함수 바이트 배열을 반복하여 필드를 소비하고 각 필드의 태그 및 값에 대한 기본 정보를 추출합니다.
페이로드 추출
추출된 값 페이로드는 다양한 형태로 저장될 수 있습니다. 필드의 예상 유형과 내용에 따른 데이터 구조. 예:
switch t { case protowire.VarintType: v, vlen := protowire.ConsumeVarint(b[taglen:fieldlen]) case protowire.Fixed64Type: v, vlen := protowire.ConsumeFixed64(b[taglen:fieldlen]) // ... }
제한 사항 및 고려 사항
이 접근 방식에는 특정 제한 사항이 있습니다.
알 수 없는 메시지 구문 분석의 대안
대부분의 시나리오에서는 알 수 없는 메시지 문제에 대해 다음과 같은 다른 관점에서 접근하는 것이 좋습니다. as:
이 문서에 설명된 접근 방식은 알 수 없는 protobuf 메시지에서 기본 정보를 추출하는 방법을 제공하지만, 다른 옵션을 사용할 수 없는 경우 대체 솔루션으로 사용해야 합니다.
위 내용은 Go에서 알 수 없는 프로토콜 버퍼를 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!