zoukankan      html  css  js  c++  java
  • go语言使用protobuf

    网上为什么充斥着大量几乎一模一样而且不正确的教程???

    妈的打开一个关于golang和protobuf的教程,无非都是protobuf多么多么牛逼,xml多么多么傻逼,然后就是怎么安装protobuf,然后又是屎一样的示例。

    关键是安装过程还不对。。我先写一下ubuntu的安装步骤,同时适用于mac和其他linux,而且保证是对的。

    一、首先去 https://github.com/google/protobuf 下载protobuf,按照readme的步骤来编译安装。如果执行autogen.sh的过程中出现autoreconf not found的错误,说明没有安装automake,在ubuntu执行sudo apt-get install automake libtool就可以了,其他平台根据实际情况安装。

    二、执行 go get -u github.com/golang/protobuf/{proto, proto-gen-go} ,自动安装proto-gen-go

    三、把proto-gen-go复制到/usr/local/bin 或者其他路径,只要在包含在PATH环境变量中就可以,为了方便protoc调用它。

    四、写一个xx.proto文件,执行protoc --go_out=. xx.proto生成go语言的代码,如果提示libprotoc.so找不到,需要把 /usr/local/lib 添加到LD_LIBRARY_PATH环境变量中。

    按照这个步骤搞下来,应该都能编译成功了,使用也很简单,网上有大量的屎示例,主要是调用Marshal和Unmarshal来编码和解码。

    那么问题来了:

    1、我用二进制传输消息意义在哪?

            当然就是字节少,传输成本小。

    2、二进制不可读啊,怎么解码呢?

            调用Unmarshal函数,把对应类型的对象传入,会自动把二进制解码到传入的对象。

    3、拿到一大坨二进制数据,怎么知道能解码到哪个类呢?

            我仍然认为数据头加上类型ID是比较好的做法。官方C++版本中可以通过协议名称得到一个协议类型,优势是不需要我们自己维护一份switch case的代码。但是类型名称一般不如ID字节少。在网游使用可以把ID多级分类,例如按照背包、好友、帮派分类,背包中再分为装备和物品,然后依次细分,这样每次增删协议对其他部分影响较少。

  • 相关阅读:
    SQL中的escape 将通配符 变成普通符号
    shell 变量
    vi 常用命令
    Java 内存模型基础
    Linux 的文件权限与目录配置
    Mybatis 源码分析之事物管理
    Mybatis 源码分析之一二级缓存
    Mybatis源码分析之结果集处理
    从JDBC看Mybatis的设计
    Mybatis源码分析之插件的原理
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/4673908.html
Copyright © 2011-2022 走看看