Go語言學習筆記 五

2021-09-11 19:57:38 字數 3296 閱讀 4191

這是go語言學習筆記的第五篇

條件語句格式:

if condition 

else

幾點注意的地方:

func

example

(x int

)int

else

}

選擇語句格式:

switch i
switch幾點注意的地方:

go語言中迴圈語句只支援for關鍵字,不支援whiledo-while。for基本用法如下:

sum :=

0//第一種

for i:=

0; i <

10; i++

//第二種

for}

for迴圈還可以配合range關鍵字來迭代陣列,切片,通道以及集合map中的元素。如下:

nums :=

intfor i, num :=

range nums

在陣列和切片中它返回元素的索引和索引對應的值,在集合中返回 key-value 對的 key 值。

for迴圈幾點需要注意的地方:

goto語句表示跳轉到本函式的某個標籤。如:

func

myfunc()

}

函式宣告

函式一般按照如下格式宣告:func name(parameter-list)(result-list)parameter-list表明函式的引數以及型別,result-list描述函式返回值名字以及型別,函式的返回值不是必須的,但是如果乙個函式宣告包含返回值,則必須以return語句結尾,除非函式無法執行至結尾,例如函式中有無限迴圈等情況。下面的4中宣告方法都是正確的:

func

add(x int

, y int

)int

func

sub(x, y int

)(z int

)func

first

(x int,_

int)

intfunc

zero

(int

,int

)int

多返回值

在前面已經了解,go中函式可以有多個返回值。如果命名了返回值引數,乙個沒有引數的return語句,會將當前的值作為返回值返回。但如果遇到if等**塊和返回值同名,則需要顯式寫出返回值。

func

split

(sum int

)(x, y int

)

錯誤處理

go語言定義了關於錯誤處理的標準模式,即error介面。

error的型別可能是nil或non-nil, nil意味著執行成功,non-nil表示失敗。當函式呼叫返回錯誤時,一般常用的處理方式:

最常用的方式是將錯誤直接返回給呼叫方。如:

nil重新嘗試失敗的操作,但是注意限制重試的時間間隔或者重試次數

如果錯誤發生,程式無法繼續執行,則需要輸出錯誤資訊並結束程式

如果錯誤不嚴重,可以直接忽略掉錯誤。

看乙個例子,例子展示如何從標準輸入中讀取字元,以及判斷檔案結束。io包保證任何由檔案結束引起的讀取失敗都返回同乙個錯誤-io.eof

in := bufio.

newreader

(os.stdin)

forif err !=

nil}

匿名函式和閉包

匿名函式顧名思義,就是不帶函式名的函式,在go語言中,可以隨時在**裡定義匿名函式。例如:

func

main()

}

函式可以像普通變數一樣被傳遞或引用。

閉包和匿名函式不太一樣,但是在go中閉包必須由匿名函式實現。閉包中包含自由變數的**塊,自由變數指的是未繫結到特定物件的變數。同時閉包還包含自由變數當時的環境,即作用域。我們看乙個例子:

func

main()

}()a

()j *=2a()}

執行結果是:

i, j: 10, 5

i, j: 10, 10

由於變數a指向的閉包函式引用了區域性變數i和j, i的值被隔離,在閉包外不能被修改,改變j的值以後,再次呼叫a, 發現結果是修改的值。

需要注意的地方是:下面的**是有問題的

var strs [

]func()

var strslice =

string

for_

, str :=

range strslice )}

for_

, str1 :=

range strs

問題原因在於迴圈變數的作用域。在第乙個for迴圈中閉包記錄的是迴圈變數str的記憶體位址,並不是每次迴圈變數str的值。因此在呼叫str1()的時候,strs裡面其實儲存的值已經是迴圈迭代完的值,即「language」。

go底層實現閉包的原理:其實是閉包返回的函式指標指向的記憶體區域是乙個結構體,該結構體包含了匿名函式的指標和自由變數的指標。

解決辦法就是每次複製變數str然後傳到匿名函式中,讓閉包的環境變數不相同。即:

for

_, str :=

range strslice

)}

關於閉包的解釋,這裡推薦一篇文章:「closures in go」,看完以後感覺對閉包會有更深的理解。

Go語言學習筆記五 map

func main 直接建立有值的map var m2 map string int map nil m3 make map string string map empty map 可以看出,在go中可以建立map的方式還是很多的,就算是不初始化,也可以賦值 在map的key可以使用那些型別?獲取k...

go語言學習筆記

type info struct func main fmt.println info1 data,json.marshal info1 fmt.println string data 輸出 這裡要特別注意的是 json 冒號後面和雙引號之間千萬不要有空格!被坑慘了 go語言 import的包的前面...

Go語言 學習筆記

import 下劃線 如 import hello imp 的作用 當匯入乙個包時,該包下的檔案裡所有init 函式都會被執行,然而,有些時候我們並不需要把整個包都匯入進來,僅僅是是希望它執行init 函式而已。這個時候就可以使用 import 引用該包。即使用 import 包路徑 只是引用該包,...