發表文章

目前顯示的是 7月, 2018的文章

[Go] 閱讀心得 Why should you learn Go?

Why should you learn Go? 原文網址 這邊文章介紹為什麼要使用Go語言,閱讀後,個人摘錄一些部分並記錄自己的心得。 PART 1 作者首先討論摩爾定律這件事情,並且認為這個定律是失敗的,卡在物理上的限制。其實我認為這個定律還沒完全失敗,如果時間拉長用5年、10年來看的話,哪天突破一個想像的限制,硬體所能提供的運算速度又會飄上去了。 We cannot add more and more cache to the processor to increase performance as cache have physical limits: the bigger the cache, the slower it gets. 這段話有如大學時上課唸到的教科書所述,加大cache並非萬能,越肥的體積占在CPU裡面,帶來的副作用跟幫助效用成反比。 Adding more core to the processor has its cost too. 這也沒錯,無限加core有極限,不是頂天的解法。推論的結果是不能依賴硬體,要靠軟體的協助。 然後作者說非常upset,現代的軟體來講,有效運用硬體資源的程度遠遠不夠,換句話落後很多硬體方面的成長。 這句話我在學生時代就有聽過,但不能夠深刻體會,直到我稍微了解了gorutine是什麼鬼東西。GOD ! 真的是軟體不夠力,還可以靠軟體再進化一個程度。 碰巧下個段落作者馬上就提到gorutine了,gorutine就是golang拿來突破物理限制的銀彈。 PART 2 作者說到Java、Python 是90年代的背景而生的,那時候只有單執行緒,雖然後來都可以執行多個執行緒,但併發、執行緒鎖、競爭、死結,新的執行緒生出需要很久,需要產生1MB以上的heap,更困難的是執行緒之間的溝通,這些不得不面對的問題拖累我們熟悉的這些程式語言。 這部分的背景之前我比較不清楚,但就我所知的Java,可不能小看,Java在管理這些東西運行的非常穩定,他有一套獨特的處理機制。讓我想到有如Apple當初推出iphone5時RAM只有1GB的大小,但人家速度就是吊打16GB RAM的HTC,HTC 掰~ 但單論『併發』的問題,JAVA也許真的很難與擁有

[Go] 指標 pointer with golang

以前學C和C++對指標有很大誤解,老師對不起,但您說的內容,學生當時真的不太懂,事隔多年我努力用比較簡白的文字來描述,彌補當年慘烈成績的遺憾。 以下三個都在說同樣的一件事,但我不知道為什麼以前透過function傳接球,腦袋轉不過來。 PART I b := 10 var a *int = &b 指標只能存位址(address) ,你要嘛弄個指標的型態(如範例是*int)去存人家位置,要嘛用一般的變數去存一般的值 PART II b := 10 a:= &b a 其實被宣告為*int PART III func main() { b := 10 setFunc(&b) } func setFunc(a *int) { } var a *int = &b 將『指標(命名為a) 指向b』用法就這樣,沒有別的,沒事不會亂用或單獨用『&』『*』 『int』 跟 『*int』雖然長得87分像,但兩個完全不一樣, 『int』叫做整數,『*int』如上的用途的時候叫做指標,指的對像是整數。如果『*int』可以改叫做『pointerToInt』之類的關鍵字,我大一也不會被當掉了,大概吧。 改值是另一件事, *a = 10,這時候的『星號』已經暗指a在之前已經被宣告成指標的type,這點很重要,『星號』在這時候的用途英文叫做 derefference , 中文有人叫做『提取』,不管你是一層指標,還是像C語言有人有點毛病寫了三層指標,都可以想成一層一層將內容提取出來的概念,一但用了『提取』(*a = 10),不管在哪裡都會被改到。 *a 絕對不等於 var a *int 的意思 *a : a 已經被宣告成指標,提取a 的內容 var a *int : a 被宣告為指標型態,就跟被宣告為int或者string一樣稀鬆平常,你對於int的變數只能放int,對於string的變數只能放string,那指標只能放位址,只是有點複雜,指標的型態一定還有個附加屬性,這裡是int,所以宣告為* int Created Date : 2018

[Go] 錯誤訊息歷經收集

panic: assignment to entry in nil map 原因:  map的使用一定要初始化,所以配合make一起用,雖然編譯的時候可以過關 正確寫法: reMapUser := make(map[string]ST.SingleUserObject) short write 原因:  實際寫入的內容比預期的短少,換句話說東西只寫入一部分,部分有丟失,自己是在用gorutine短時間寫入redis同一個key遇到 protoc-gen-go: program not found or is not executable –go_out: protoc-gen-go: Plugin failed with status code 1. 這是有使用套件protoco: https://developers.google.com/protocol-buffers/ 原因:  中途我改了GOPATH,把GOPATH 改回來就沒事 Created Date : 2018/07/30 Last Updated Date : 2018/07/31