Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon dont Golang utilise protobuf

Explication détaillée de la façon dont Golang utilise protobuf

尚
avant
2020-01-14 17:52:453305parcourir

Explication détaillée de la façon dont Golang utilise protobuf

1. Téléchargez le protocole du compilateur protobuf

Adresse : https://github.com/google/protobuf/releases

fenêtre :

Télécharger : protoc-3.3.0-win32.zip

Décompressez, copiez protoc.exe dans le répertoire bin dans GOPATH/bin et ajoutez GOPATH/bin à la variable d'environnement.

Bien sûr, il peut également être placé dans d'autres répertoires. Vous devez ajouter des variables d'environnement pour que le système puisse trouver protoc.exe

linux :

Télécharger : protoc. -3.3.0-linux- Décompressez x86_64.zip ou protoc-3.3.0-linux-x86_32.zip

, copiez le protocole dans le répertoire bin dans GOPATH/bin et ajoutez GOPATH/bin à l'environnement variable.

Si vous aimez compiler et installer, vous pouvez également télécharger le code source et l'installer vous-même, et enfin ajouter le fichier exécutable à la variable d'environnement.

2. Obtenez le plug-in du compilateur protobuf protoc-gen-go

Entrez dans le répertoire GOPATH

exécutez

> go get -u github.com/golang/protobuf/protoc-gen-go

En cas de succès, ce sera dans GOPATH/bin Générez le fichier protoc-gen-go.exe

3. Créez un fichier test.proto

//指定版本
//注意proto3与proto2的写法有些不同
syntax = "proto3";
 
//包名,通过protoc生成时go文件时
package test;
 
//手机类型
//枚举类型第一个字段必须为0
enum PhoneType {
    HOME = 0;
    WORK = 1;
}
 
//手机
message Phone {
    PhoneType type = 1;
    string number = 2;
}
 
//人
message Person {
    //后面的数字表示标识号
    int32 id = 1;
    string name = 2;
    //repeated表示可重复
    //可以有多个手机
    repeated Phone phones = 3;
}
 
//联系簿
message ContactBook {
    repeated Person persons = 1;
}

4. Exécutez la commande suivante

> protoc --go_out=. *.proto

pour générer. un fichier test.pb.go

5. Utilisez protobuf

package main;
 
import (
    "github.com/golang/protobuf/proto"
    "protobuf/test"
    "io/ioutil"
    "os"
    "fmt"
)
 
func write() {
    p1 := &test.Person{
        Id:   1,
        Name: "小张",
        Phones: []*test.Phone{
            {test.PhoneType_HOME, "111111111"},
            {test.PhoneType_WORK, "222222222"},
        },
    };
    p2 := &test.Person{
        Id:   2,
        Name: "小王",
        Phones: []*test.Phone{
            {test.PhoneType_HOME, "333333333"},
            {test.PhoneType_WORK, "444444444"},
        },
    };
 
    //创建地址簿
    book := &test.ContactBook{};
    book.Persons = append(book.Persons, p1);
    book.Persons = append(book.Persons, p2);
 
    //编码数据
    data, _ := proto.Marshal(book);
    //把数据写入文件
    ioutil.WriteFile("./test.txt", data, os.ModePerm);
}
 
func read() {
    //读取文件数据
    data, _ := ioutil.ReadFile("./test.txt");
    book := &test.ContactBook{};
    //解码数据
    proto.Unmarshal(data, book);
    for _, v := range book.Persons {
        fmt.Println(v.Id, v.Name);
        for _, vv := range v.Phones {
            fmt.Println(vv.Type, vv.Number);
        }
    }
}
 
func main() {
    write();
    read();
}
rrreee

en Explication détaillée de la façon dont Golang utilise protobufgo languepour plus de connaissances en langue go, veuillez faire attention à Site Web PHP chinoisTutoriel de langue Go

Colonne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer