網上為什么充斥着大量幾乎一模一樣而且不正確的教程???
媽的打開一個關於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多級分類,例如按照背包、好友、幫派分類,背包中再分為裝備和物品,然后依次細分,這樣每次增刪協議對其他部分影響較少。