這是一個建立於
的文章,其中的資訊可能已經有所發展或是發生改變。
網上為什麼充斥著大量幾乎一模一樣而且不正確的教程???
媽的開啟一個關於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、拿到一大坨位元據,怎麼知道能解碼到哪個類呢?
這個問題問得好,媽的沒找到任何地方有人提到這件事,強行忽略然後裝作會了嗎?在扯他媽的protobuf多麼多麼牛逼的時候都提到內建反射機制,能夠類型推導,到底怎麼推導你他媽怎麼不說啊???
4、難道只能互相知道要傳輸的類型,然後才能愉快的用protobuf嗎?
知道了類型還用編碼幹毛啊?直接按照欄位順序硬拼在一起不就行嗎?還用protobuf幹毛???
總之,網上提到protobuf的,我不知道他們是不是真的用過protobuf,抱Google爸爸的大腿趕潮流並沒有錯,但是強行裝出一副深藏功與名的樣子是一種好風氣嗎?
最後,我還是建議,做網遊協議,還是自己實現序列化和還原序列化吧,無非就是加個類型id而已,這就算原始到令人髮指了??
下一步就是開始幹。