發表文章

目前顯示的是有「小筆記」標籤的文章

[Redis] [Go] Send 不加 MULTI 會怎麼樣

圖片
做redis transaction 基本上先放MULTI,再SEND要操作的行為後,最後送出EXEC。 但SEND 本身是在做queue的動作,即使沒有先送MULTI,也是可以成功把做queue的指令丟給redis。 為了弄清楚差異,做了一點實驗,以下搭配GOlang。 實驗一: 說明:         將最後的EXEC註解掉,中間插個DO。 結果:         結果DO以前有寫入redis,DO以後的沒作用。 實驗二: 說明:         根據實驗一的基礎上,但最一開始有用MULTI包起來。 結果:         結果即使中間有DO,但都沒寫入redis(DO也沒寫入?)。 實驗三: 說明:         將實驗二最下面的EXEC註解打開。 結果:         通通寫入redis。 結論:                 如果沒包MULTI,會因為有DO的指令,沒而被一起執行下去。         如果有包MULTI,因為MULTI會認EXEC,而導致中間的DO,被吃掉。         碰到EXEC,不管之前有包幾個MULTI,都會一併執行。 Created Date : 2018/08/16 Last Updated Date : 2018/08/16

[Go] Golang 的 slice 進階know how

之前聽別人分享使用slice 遇到有些坑,但未說明來由。 最近在閱讀 Golang 新手可能会踩的 50 个坑 ( 英文原文 ) 也看到關於slice說明的一些現象,為什麼有些值會無故消失,或者無故被更改,於是好奇花了些時間研究了一下。 下列說明配合source code,這邊就不重複貼了。 my source code on github 先說結論,slice的使用方式是pointer。 slice、map、channel 三者在Golang使用上是操作方式是pointer,不熟悉的話建議先把內容copy起來再操作比較保險。 請參考GO FAQ Why are maps, slices, and channels references while arrays are values? 我自己在寫FAQ的心得文章 有印象。 當下是以為在傳遞function的參數,和接受參數的部分對於 maps, slices, and channels 有這樣的說明,不過現在看來這個也是在講平常assign的使用上。 實驗分為test1() test2() test3()。 test1() 和test2() 把某個slice assign到另外一新的變數,表面上看似有了兩個slice,不過是多了一個新的變數名稱,其實指到相同的slice內容而已。 如果改了其中的內容,兩個slice都會影響到,因為他們是指向同樣的地方。 但若(舊的slice + 新的value) ----> 就會自動產生出新的slice,於是跟舊的slice沒有關係了,各改各的不會受影響。 test3() 將記憶體位置印出來,事實上實驗起來,可以發現每個slice裡面的index皆占了一個記憶體空間,假設有兩個slice,裡面的元素可以指向同樣的地方,也可以分別指到不同的地方 x := append(s, 11) // 只有擴到x,但s還是舊的 fmt.Println("cap(s) =", cap(s), "ptr(s) =", &s[0], "ptr(x) =", &x[0]) fmt.Println("cap(s) ...

[Go] Golang了解 array 和 slice 的差異,簡單說明

array 一開始就宣告大小,不可以再變動。 slice 則是動態增長。 對於array的型態來說,[2]int 和 [3]int 會是不同的型態,長度大小可以理解為某種附加型態,要有指定大小+中括號才是array。 array和slice在執行速度上也差異很多,在我macbook pro 2017,的簡單測試1到100階乘的加總,一個是nanoseconde的運算時間,一個是microsecond。 Created Date : 2018/08/07 Last Updated Date : 2018/08/07

[Go] Golang用法 function input & output 參數可以同樣型態放一起

參數太長該怎麼辦,同樣類型的可以寫在一起。 這件事情我知道的時候還蠻訝異的,同時,又得知不只傳入的參數可以這樣,return的型態也可以這樣搞。 另外,若事先指定回傳的變數名稱,可以在function當中各處先assign你要的回傳值到這些變數。 Input的參數可以類型寫一起 func GetMyData(name string, sex string, birthday string,id int, number int) { } // 可以改寫為 func GetMyData(name, sex, birthday string, id, number int) { } return的參數也可以類型寫一起,並且偷偷宣告變數名稱 func GetMyData(name, sex, birthday string, id, number int) (bool,bool){ } // 可以指定命名 func GetMyData(name, sex, birthday string, id, number int) (isOK bool, isPassed bool){ } // 當然也可以匯集 func GetMyData(name, sex, birthday string, id, number int) (isOK, isPassed bool){ } function 中串插要回傳的值 func GetMyData(name, sex, birthday string, id, number int) (bool, bool){ isOK := true isPassed := false return isOK, isPassed } // 就可以改寫為 func GetMyData(name, sex, birthday string, id, number int) (isOK, isPassed bool){ isOK = true // 中間有些co...

[Go] Golang用法 package import 前面的底線

package import 前面的底線 init() 是GO 的關鍵字,每個package都存在一個這樣預設的init() 對於main package來說,在進入main()之前,會先執行init(),如果你有寫在這個package某處的話。 在import package時 對於引用package來講,只會執行這個package的init(),其他部分不會用到。 如使用gorm,我只想用mysql的部分,因此按照文件,我要import “github.com/go-sql-driver/mysql”,但前面加上_ 即可 import ( _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" ) Created Date : 2018/08/03 Last Updated Date : 2018/08/03