Go踩坑總結

  1. 在函數外面定義變量時 要用var 不能用:=
  2. byte8位 rune32位字符類型
  3. complex64(複數,實部32位,虛部32位)
  4. go中沒有隱式類型轉換 類型轉換都是強制的
  5. float 類型四捨五入爲int: int((a*10+5)/10)
  6. //正確
    const a = 3
    var b float64 = 2
    c := a+b 
    
    //錯誤
    var a = 3
    var b float64 = 2
    c := a+b
    
  7. go的switch是自動break的,可以用fallthrough 取消break
  8. 換行需打逗號
    //正確
    fmt.Println(a,b)
    fmt.Println(a,
    			b)
    fmt.Println(a,
    			b,
    		)
    //錯誤
    fmt.Println(a,
    			b
    		)
    
  9. go中的指針不能進行運算(與c++不同)
  10. go中參數的傳遞只有值傳遞一種方式
  11. 交換兩個變量:a,b = b,a
  12. iota 在const 中使用,從0開始遞增
    const(
    	B = 1 <<(10*iota)
    	KB
    	MB
    )
    
  13. //定義數組
    var arr [5]int
    arr := [5]int{1,2,3,4,5}
    arr := [...]{1,2,3,4,5}
    
  14. 數組是值類型
  15. 切片是數組的一個視圖引用類型
  16. 切片可以向後擴展,不可以向前擴展
    在這裏插入圖片描述
    在這裏插入圖片描述
    注:切片時可以向後擴展,不能超過cap,取值時不能擴展,不能超過len
  17. append時,若超越cap,系統會重新分配更大的底層數組
  18. map的key是無序的
  19. 若從map取值時,key不存在,會返回默認值,不會報錯
  20. 爲結構定義的方法,必須放在同一個包內(可以是不同的文件)
  21. 指針接收者實現只能以指針方式使用,值接收者都可
  22. defer執行順序類似棧,先進後出
  23. 參數在defer語句時計算
func T(){
	i := 0
	defer fmt.Println(i)
	i = 1000
	return
}
//Output:0
  1. defer 和return
reutrn
返回值 = x
defer邏輯
RET指令
func F1(){
	x := 5
	defer fun(){
		x += 1
	}()
	return x
}
//Output: 5

func F2()(x int){
	defer func(){
		x += 1
	}()
	return 5
}
//Output:6
  1. panic過程:停止當前函數執行,一直向上返回,執行每層的defer(defer在panic之前定義)如果沒有遇見recover,程序退出
  2. recover:僅在defer調用中使用,獲取panic的值,如果無法處理,可以重新panic
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章