天天看點

golang for循環_golang 遇坑總結

1. for range循環周遊slice/map,值是複制的,且每次循環都是用同一個值儲存複制後的值

package 
           

第一次循環時用v儲存了第一個student的值,然後第二次循環時依然用v儲存的第二個值,這就導緻&v一直是一樣的

2. map[int]*struct可以直接對struct元素指派,而map[int]struct不可以

type 
           

3. 所有函數參數都是在定義函數的那一行就預先運作了參數計算,與函數實際運作順序無關

func 
           

4. 調用對象的方法,會根據需要自動轉換為指針或者對象;調用接口的方法,必須區分是執行個體方法還是指針方法,指針可以調用執行個體方法,反之不行

// 調用對象方法
           

總結一下就是非指針接口不能調用指針方法,其他都可以

5. 函數不可以比較(隻能和nil比較),是以不可以做為map的key

6. map中的元素是會變動的,是以不能取位址

7. 接口指派,即便指派為nil,但不等于nil

iseprimport 
           

8. json與golnag類型對應關系

bool, for JSON booleans

float64, for JSON numbers

string, for JSON strings

[]interface{}, for JSON arrays

map[string]interface{}, for JSON objects

nil for JSON null
           

9. golang字元串,每個字元是rune類型

for _, s := range strings // s is rune

strings[0] // byte alias uint8

10. 函數傳回值:命名傳回值和非命名傳回值的差別

https://play.golang.org/p/wxE5r5DQbs9​play.golang.org

package main

func main() {

	println(DeferFunc1(1))
	println(DeferFunc2(1))
	println(DeferFunc3(1))
}

func DeferFunc1(i int) (t int) {
	t = i
	defer func() {
		t += 3
	}()
	return t
}

func DeferFunc2(i int) int {
	t := i
	defer func() {
		t += 3
	}()
	return t
}

func DeferFunc3(i int) (t int) {
	defer func() {
		t += i
	}()
	return 2
}

// OUTPUT
4
1
3
           

普通傳回執行順序:

1. res = xxx
2. defer            // 無法修改傳回值
3. return res
           

命名傳回

1. 函數在執行最開始時已經初始化了命名傳回
2. defer            // 可以修改傳回值
3. return 命名傳回
           

11. iota用法

const (
	x = iota
	y
	z = "zz"
	k
	p = iota
)

func main()  {
	fmt.Println(x,y,z,k,p)
}

// output
0, 1, zz, zz, 4
           

12. 細節注意

const 常量不可以取位址

goto 不可以跳入下一層,隻能調到和goto語句同層或者上層

break 隻會跳出目前for循環

type alias定義的變量不是新的類型,可以直接用原始類型指派,且具有原始類型的方法,和原始類型除了名字有差別,其他一樣,而type定義的是新的類型

Named Type可以與Unamed Type互相指派,隻要底層一樣

panic僅有最後一個可以被revover捕獲

13. string拼接

  1. 在已有字元串數組的場合,使用 strings.Join() 能有比較好的性能
  2. 在一些性能要求較高的場合,盡量使用 buffer.WriteString() 以獲得更好的性能
  3. 性能要求不太高的場合,直接使用運算符,代碼更簡短清晰,能獲得比較好的可讀性
  4. 如果需要拼接的不僅僅是字元串,還有數字之類的其他需求的話,可以考慮 fmt.Sprintf()

14. compare

bool int float complex string 這都是基本類型,直接比較

array 類型相等且所有值相等才相等

pointer 指向同一個value那麼相等,或者都為nil

channel 同一個make傳回的相等,或者都為nil

interface dynamic type and dynamic value都相等才相等,或者都為nil

struct 非 _ 字段都可以比較,且都相等才相等

x 實作了interface T,如果x可以比較,那麼将x轉換為interface比較

Slice, map, and function values are not comparable.

pointer channel interface 初始值都是nil

使用reflect.DeepEqual對slice比較,一定要注意nil!= [],通常從db中擷取的slice和http擷取的slice空值不一樣

15. interface and reflect

  • 從interface到reflect對象
  • 從reflect對象到interface
  • 改變一個interface,但它的值必須是可被改變的
golang for循環_golang 遇坑總結

繼續閱讀