*** golang
使用go build編譯該程序,注意這裏須要指定 -gcflags "-N -l" 關閉編譯器優化,不然編譯器可能把對sum函數的調用優化掉。正則表達式
bobo@ubuntu:~/study/go$ gobuild -gcflags"-N -l"sum.go
***json
go fmt命令——格式化代碼文件ubuntu
https://studygolang.com/articles/18538?fr=sidebar閉包
***併發
通道-chan異步
發送端關閉通道,而不該該在接收端關閉通道,不然會引發panicide
***函數
通道的特性就是它的自同步和其元素值的原子性。優化
在 go 語言的併發程序中,通道會成爲聯繫各個Goroutine的紐帶。
在須要循環的接收通道中的元素值的場景下,應該優先使用 for 語句來實現:
var ch chan int
if ch != nil{
for ch != range ch {
fimt.Printf("Element: %v\n",e)
}
}
select 語句中,default case 會在收發操做沒法配對的狀況下被選中並執行。
代碼包 time 中的定時器(time.Timer)和 斷續器(time.Ticker)都充分利用了緩衝通道的異步特性來傳達到期事件。
*** 鎖
go 語言中,死鎖錯誤的發生概率極低。其主要緣由是有defer 語句的存在。
在 Go 語言中,讀寫鎖有結構體類型 sync.RWMutex 表明。與互斥鎖相似,sync.RWMutex類型的零值就已是當即可用的讀寫鎖了。在此類型的方法集合中包含了兩對方法,即:
func (*RWMutex) Lock
func (*RWMutex) Unlock
和
func (*RWMutex) RLock
func (*RWMutex) RUnlock
前一對方法的名稱和簽名與互斥鎖的那兩個方法徹底一致。它們分別表明了對寫操做的鎖定和解鎖。如下簡稱它們爲寫鎖定和寫解鎖。
然後一對方法則分別表示了對讀操做的鎖定和解鎖,如下簡稱它們爲讀鎖定和讀解鎖。
寫解鎖在進行的時候會試圖喚醒全部因欲進行讀解鎖而被阻塞的Goroutine。而讀解鎖在進行的時候只會在已無任何讀鎖定的狀況下試圖喚醒一個因欲進行寫鎖定而被阻塞的Goroutine。若對一個未被寫鎖定的讀寫鎖進行解鎖,就會引發一個運行時恐慌,而對一個未被讀鎖定的讀寫鎖進行讀解鎖不會發生 panic。
原則上,不該該把通道看成互斥鎖或信號燈來使用。
《effective go》
gofmt 格式化 go 源文件
go 文件註釋:
------------------------------------------------------------------------------------------------------
/*
regexp 包爲正則表達式實現了一個簡單的庫。
該庫接受的正則表達式語法爲:
正則表達式:
串聯 { '|' 串聯 }
串聯:
{ 閉包 }
閉包:
條目 [ '*' | '+' | '?' ]
條目:
'^'
'$'
'.'
字符
'[' [ '^' ] 字符遍歷 ']'
'(' 正則表達式 ')'
*/
package regexp
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
在程序中,每一個可導出(首字母大寫) 的名稱都應該有文檔註釋。
------------------------------------------------------------------------------------------------------
命名:
大寫首字母,包外可見。
包應當以小寫的單個單詞來命名,且不該該使用下劃線或駝峯記法。
獲取器:若你有個名爲 owner (小寫,未導出) 的字段,其獲取器應當名爲 Owner(大寫,可導出) 而非 GetOwner。 設置器方法,SetOwner .
Go 中約定使用駝峯記法(匈牙利命名法) MixedCaps 或 mixedCaps 。
以指針或值爲接收者的區別在於:值方法可經過指針和值調用,而指針方法只能經過指針來調用。
若該值是可尋址的, 那麼該語言就會自動插入取址操做符來對付通常的經過值調用的指針方
法。在咱們的例子中,變量 b 是可尋址的,所以咱們只需經過 b.Write 來調用它的 Write 方
法,編譯器會將它重寫爲 (&b).Write
用空白標識符聲明一個全局變量:
var _ json.Marshaler = (*RawMessage)(nil)
檢測json.Marshaler 的實現狀況。