Go 操作手冊

2021-10-08 17:38:25 字數 4086 閱讀 9660

main包具有特殊含義,go編譯器識別main包,並執行底下的main函式,將其編譯為二進位制可執行檔案。

main作為主函式,每個**檔案中的init函式都會在main函式執行前呼叫。

)下劃線代表別名,因為go不允許**檔案裡存在未使用的import,使用_忽視這個規則,可以呼叫引入庫的init方法。

支援range,每次迭代返回兩個值,第乙個是迭代的元素在切片裡的索引位置,第二個值是元素值的乙個副本。示例:

for _, feed := range feeds
for index := 2; index < len(slice); index++
內建函式len返回長度,cap返回容量

type feed struct
`引號裡的部分被稱作標記(tag),描述了json階碼的元資料,將結構型別的字段與json裡指定的字段一一對應,同樣也可以匹配於別的資料來源。

type matcher inte***ce
介面的行為最終由在這個介面型別中宣告的方法決定。go的命名慣例:單個方法的介面名以er結尾。

實現介面:

type defaultmatcher struct{}

func init()

func (m defaultmatcher) search(feed *feed, searchterm string) (*result, error)

func (m defaultmatcher) search
這行**代表search函式帶有接收者,即指定defaultmatcher型別。接收者既可以是型別值,也可以是指向這個型別值的指標。最佳實踐是將方法的接收者宣告為指標。當方法接收者設定為指標型別,那麼當介面型別的值呼叫方法時,只有指標能夠呼叫。如果發放的接收者設定為值型別,那麼沒有這個限制。

defer關鍵字會安排隨後的函式呼叫在函式返回時才執行,即使函式意外崩潰終止,也能保證defer後的函式被執行。

defer file.close()
var matchers = make(map[string]matcher)
var關鍵字宣告變數,表明matchers是乙個以string為key,matcher為value的map。使用make來構造map,因為map是一種引用型別,預設的零值是nil。其他的引用型別還有channel、slice、inte***ce以及函式型別。

變數宣告也可以用簡化的宣告運算子:=,比如:

feeds, err := retrievefeeds()
一般來說,如果需要宣告初始值為零值的變數,應該使用var來宣告變數;如果有確切的初始值或函式返回值,那麼用簡化變數宣告運算子。

變數名以小寫字母開頭表明是包內使用的變數,以大寫開頭則對外開放。

在go中,所有變數都被初始化為零值。數值->0,字串->"",布林->false,指標->nil。

go中支援陣列的切片。

go中所有的引數傳遞都是值傳遞。

var array [5]int
array := [5]int
array := [...]int
...讓go自動統計元素數。

​array := [5]*int

​*array[0] = 10

*array[1] = 20

整型指標陣列,為陣列前兩個元素賦值。

var array2 [5]int

array2 = array

go的陣列可以通過賦值直接複製另乙個陣列的值,但前提是兩個陣列的長度和型別必須相同。

var array[4][2]int

array := [4][2]int, , , }

二維陣列

與陣列不同,切片是一種引用型別,容量是切片內元素允許增長到最大的值。當不指定[ ]運算子裡的值時,建立的才是切片,否則是陣列。切片的底層是陣列,它的指標指向陣列元素。

// 切片容量和長度都是5

slice := make(string, 5)

// 切片容量為5,長度為3

slice := make(string, 3, 5)

// 基於初始化時提供的元素確定容量

slice := string

// 空切片

slice := make(int, 0)

// or

slice := int{}

// 切片

newslice := slice[1:3]

由於切片是引用型別,關聯資料儲存在底層陣列,所以在傳遞切片時所占用的記憶體很小,不需要傳遞指標。

// 建立map

dict := make(map[string]int)

dict := map[string]string

matcher, exists := matchers[feed.type]

if !exists

迭代map

for key, value := range colors
刪除

delete(colors, "red")
map的底層同樣是陣列。map也是引用型別。

賦值給兩個變數,第乙個變數和賦值給乙個變數一樣,都是map查詢的結果。如果有第二個值,它表示的是查詢的鍵是否在map裡,是乙個布林值。

type user struct 

lisa := user

// 對順序有要求的方式

lisa := user

巢狀定義

type admin struct 

fred := admin,

level: "super",

}

編譯器只允許為命名的使用者定義的型別宣告方法,比如:

type ip byte

func (ip ip) marshaltext() (byte, error)

內部型別實現介面,會提公升至外部型別同樣實現這個介面。比如user實現了某個介面,那麼也會認為admin也實現了此介面,在引數傳遞時可以接收user實現介面的函式同樣會接受admin結構。如果想實現內部型別和外部型別的多型,那麼需要讓外部型別也作為接收者實現介面。

go的併發同步模型源於通訊順序程序csp的泛型,這是一種訊息傳遞模型,通過在goroutine之間傳遞資料來傳遞訊息,而不是對資料進行加鎖來實現同步訪問。goroutine之間同步和傳遞的關鍵資料型別叫做通道channel。goroutine

go func(matcher matcher, feed *feed) (matcher, feed)
所有的goroutine都會因為閉包共享外層變數。

goroutine間可以通過指標共享資料

使用goroutine的最佳實踐之一:在main函式返回前,清理並終止所有之前啟動的goroutine。

可以使用sync包的waitgroup來跟蹤goroutine的工作是否完成,waitgroup是乙個計數訊號量,使用方法如下:

var waitgroup sync.waitgroup

waitgroup.add(len(feeds))

使用它的add函式來設定將要啟動的goroutine的數量,使用done函式來表示當前goroutine執行完成。

Docker操作手冊

安裝 curl fssl sh sudo groupadd docker sudo gpasswd a docker登出 重新登陸 檢視映象 docker search 用互動方式建立並進入容器 docker run i t 映象id bin bash 再次進入容器docker start 容器id...

git 操作手冊

我們先來理解下git 工作區 暫存區和版本庫概念 下面這個圖展示了工作區 版本庫中的暫存區和版本庫之間的關係 圖中我們可以看出此時 head 實際是指向 master 分支的乙個 游標 所以圖示的命令中出現 head 的地方可以用 master 來替換。圖中的 objects 標識的區域為 git ...

Hbase Solr操作手冊

hbase solr操作手冊 1 對於初次建立得表,可以使用 create table 注 其中1表示開啟replication功能,0表示不開啟,預設為0 對於已經存在得表,可以 disable hcc score alter hcc score enable hcc score 2 生成實體配置...