這是go語言學習筆記的第五篇條件語句格式:
if condition
else
幾點注意的地方:
func
example
(x int
)int
else
}
選擇語句格式:
switch i
switch
幾點注意的地方:
go語言中迴圈語句只支援for
關鍵字,不支援while
和do-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 包路徑 只是引用該包,...