可見(jiàn)性
- 聲明在函數(shù)內(nèi)部,是函數(shù)的本地值,類(lèi)似private
- 聲明在函數(shù)外部,是對(duì)當(dāng)前包可見(jiàn)(包內(nèi)所有.go文件都可見(jiàn))的全局值,類(lèi)似protect
- 聲明在函數(shù)外部且首字母大寫(xiě)是所有包可見(jiàn)的全局值,類(lèi)似public
類(lèi)型
- 值類(lèi)型: bool, int(32 or 64), int8, int16, int32, int64, uint(32 or 64), uint8(byte), uint16, uint32, uint64, float32, float64, string,complex64, complex128, array -- 固定長(zhǎng)度的數(shù)組
- 引用類(lèi)型:
slice -- 序列數(shù)組(最常用)
map -- 映射
chan -- 管道`
和js不同,go的array是值類(lèi)型,事實(shí)上js的array特性和go的slice更加貼近,因?yàn)閖s的數(shù)組是變長(zhǎng)的,而go中是定長(zhǎng)的
展開(kāi)運(yùn)算符
go中展開(kāi)運(yùn)算符是后置的,
//展開(kāi)數(shù)組或切片
a:={arr...}
//聲明變參函數(shù)
func test(s string, n ...int) string {
var x int
for _, i := range n {
x += i
}
return fmt.Sprintf(s, x)
}
異常處理
go中沒(méi)有try catch這樣結(jié)構(gòu)化的異常處理,而是使用 panic 拋出錯(cuò)誤,recover 捕獲錯(cuò)誤。
- 程序遇到panic 后會(huì)中斷后續(xù)的程序執(zhí)行
-
recover的定義必須在panic 之前,因?yàn)閜anic 會(huì)終止后續(xù)代碼的執(zhí)行,如果recover 定義在panic 后面,程序已經(jīng)被中斷了,所以不會(huì)生效。 - recover 必須使用defer,不然無(wú)法捕panic
- 函數(shù)G調(diào)用函數(shù)F,如果函數(shù)F拋出panic ,G也會(huì)被中斷,但是G函數(shù)中的defer依舊會(huì)執(zhí)行
- 連續(xù)使用defer可以連續(xù)拋出panic,但是只有最后執(zhí)行的那個(gè)defer能被捕獲到,也就是后拋出的panic會(huì)覆蓋先拋出的panic,但是可以連續(xù)拋出捕獲,例如:
func main() {
defer func() {
fmt.Println("Recovering from panic in first defer.")
if err := recover(); err != nil {
fmt.Println("Recovering from panic in second defer2:", err)
}
}()
//捕獲后再次拋出
defer func() {
if err := recover(); err != nil {
fmt.Println("Recovering from panic in second defer:", err)
panic("Panic2!")
}
}()
panic("Panic!")
}
輸出結(jié)果為:
image.png
panic雖然會(huì)拋出錯(cuò)誤,但是只建議在會(huì)影響程序正常執(zhí)行的時(shí)候去使用,用于中斷程序的執(zhí)行,其他的異常情況,建議直接返回err并且處理
