Go語言的那些坑

2021-08-21 04:36:30 字數 2240 閱讀 6371

golang的source檔案的命名和其他語言本無差別,但是golang自帶unit test,它的unit test有個小規範:所有unit test檔案都要以__test.go為結尾!

所以,當你命名乙個非unit test檔案為***_test.go,而且執意要編譯時,就會報錯:no buildable go source files in ******(你的檔案路徑)

所以,切記,以__test.go為結尾的都是unit test的檔案,且切記不要把unit test檔案和普通go檔案放到一起,一定要把unit test檔案集體放到乙個目錄中,否則會編譯不過的。

三、多個defer出現的時候,多個defer之間按照lifo(後進先出)的順序執行

chan一旦被寫入資料後,當前goruntine就會被阻塞,知道有人接收才可以(即 「

select 的**形式和 switch 非常相似, 不過 select 的 case 裡的操作語句只能是」io操作」(不僅僅是取值,賦值channel也可以), select 會一直等待等到某個 case 語句完成,也就是等到成功從channel中讀到資料。 則 select 語句結束

十二、go中的指標,*符號的含義

&的意思大家都明白的,取位址,假如你想獲得乙個變數的位址,只需在變數前加上&即可。

現在,我拿到a的位址了,但是我想取得a指標指向的值,該如何操作呢?用*號,*b即可。

*的意思是對指標取值。

*&可以相互抵消,同時注意,*&可以抵消,但是&*不可以;所以a*&a是一樣的,和*&*&*&a也是一樣的。

這特麼是什麼鬼?

這就要從golang切片的擴容說起了;切片的擴容,就是當切片新增元素時,切片容量不夠了,就會擴容,擴容的大小遵循下面的原則:(如果切片的容量小於1024個元素,那麼擴容的時候slice的cap就翻番,乘以2;一旦元素個數超過1024個元素,增長因子就變成1.25,即每次增加原來容量的四分之一。)如果擴容之後,還沒有觸及原陣列的容量,那麼,切片中的指標指向的位置,就還是原陣列(這就是產生bug的原因);如果擴容之後,超過了原陣列的容量,那麼,go就會開闢一塊新的記憶體,把原來的值拷貝過來,這種情況絲毫不會影響到原陣列。

建議盡量避免bug的產生。

乙個函式在將channel作為乙個型別的引數來宣告的時候,可以將channl宣告為只可以取值()或者只可以傳送值(chan ),不特殊說明,則既可以取值,也可以傳送值。

十八、使用channel時,注意goroutine之間的執行流程問題

乙個基於無快取channel的傳送或者取值操作,會導致當前goroutine阻塞,一直等待到另外的乙個goroutine做相反的取值或者傳送操作以後,才會正常跑。

以上例子中的流程是這樣的:

主goroutine等待接收,另外的那乙個goroutine傳送了「test」並等待處理;完成通訊後,列印出」test」;兩個goroutine各自繼續跑自己的。

主goroutine等待接收,另外的那乙個goroutine傳送了「hello world」並等待處理;完成通訊後,列印出」hello world」;兩個goroutine各自繼續跑自己的。

主goroutine等待接收,另外的那乙個goroutine傳送了「123」並等待處理;完成通訊後,列印出」123」;兩個goroutine各自繼續跑自己的。

主goroutine等待接收,另外的那乙個goroutine傳送了「456」並等待處理;完成通訊後,列印出」456」;兩個goroutine各自繼續跑自己的。

主goroutine等待接收,另外的那乙個goroutine傳送了「789」並等待處理;完成通訊後,列印出」789」;兩個goroutine各自繼續跑自己的。

記住:golang的channel是用來goroutine之間通訊的,且通訊過程中會阻塞。

go import 指定分支 Go語言的那些坑二

熱烈歡迎你,相識是一種緣分,echa 哥為了你的到來特意準備了乙份驚喜,go學習資料 轉 go 語言實戰筆記教程系列大綱彙總 值得收藏 目錄 go語言的那些坑 golang中函式被看做是值,函式值不可以比較,也不可以作為map的key 請問以下 能編譯通過嗎?import fmt func main...

go語言的坑

package main import fmt func main mp make map int int fmt.println for range 坑 for index,value range slice 根本原因在於for range是用乙個變數承接mp中的內容的 for key,value...

Go語言的坑三

請看下列的列子 import fmt runtime time func main for name range names for name range names li.fmtpointer 答案 能正常編譯通過,並輸出 poniter 感覺有點詫異,請接著看以下的 試問能編譯通過?import...