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多級分類,例如按照背包、好友、幫派分類,背包中再分為裝備和物品,然后依次細分,這樣每次增刪協議對其他部分影響較少。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM