go基礎筆記
1.slice:作為參數傳遞時,傳遞的是地址,當append時,在新的內存地址分配數據,但是沒有返回給原的slice,只能通過返回值的方式賦值給slice
2.func(a []int):傳遞,可以
3.匿名函數:函數內部的聲明匿名函數
4.閉包:初始化,使用閉包
5.defer(延遲):
1>類似析構函數,在函數執行結束后按照調用順序,反序執行(棧)
2>即使發生嚴重錯誤也執行,前提是沒有發生錯誤之前先注冊
3>支持匿名函數
4>常用於資源清理,文件關閉,解鎖等
5>匿名函數訪問變量,如果是直接訪問,則訪問引用(即最后執行時的參數值),如果是傳值訪問,則是拷貝
6>go 沒有異常機制,但可以panic/recover模式處理錯誤,panic可以在任何地方引發,recover只有在defer 調用的函數中有效,並且處理panic后,程序可以繼續執行
6.struct:
語法類似c,功能就是類,成員屬性可以無名;
但必須有類型聲明,當出現匿名對象時,必須顯式初始化;
"=="判斷:屬性相同時返回true,但是對象的地址不同,和equal相同
7.點運算符與指針:與cc++不同,即使是指針訪問屬性也使用點語法,所以聲明時,保存對象的地址,操作指針時可以使用點語法操作
8.值傳遞和引用傳遞:除了指針、chanel、匿名函數訪問是引用傳遞,其他的都是值傳遞
9.匿名結構,初始化,嵌套:嵌套時,匿名屬性,只能通過鏈式賦值的方式賦值
10.繼承:GO中不存在繼承關系,但存在組合,即父類結構作為成員存放;
組合實際是將其屬性和方法賦值放在子類中,所以可以直接點語法訪問父類的屬性和方法;
當匿名組合與當前組合屬性、方法重名時不報錯,點語法作用的是當前結構的屬性、方法;
如果想訪問匿名結構的同名屬性、方法,直接點語法其匿名結構名后訪問其屬性、方法;
同級不能同名屬性、方法,可以調整組合解決;
不同級可以同名屬性、方法,點語法訪問即可。
11.在線項目api生成:gowalker.org/,閱讀開源項目非常方便
12.方法:method
接收者receiver,表明方法所屬結構,基本數據類型可以type,作為接收者,為其增加方法;
不支持重載,即同一結構下的方法不允許同名;
對象調用方法,類方法調用對象;
屬性首字母大寫是public,屬性首字母小寫是包內訪問權限;
13.接口:interface
=1個的方法簽名集合
只要實現了方法簽名相同的方法,即實現了接口
接口只是方法聲明,沒有實現,沒有數據字段
接口可以匿名嵌套,也可嵌套如結構中
14.多態:OK patern判斷
接口可以指向所有實現接口結構的對象;
interface{} 可以指向所有對象,使用type swtich判斷方便;
結構之間是組合關系,不存在繼承,所以無法多態,無法強轉;
接口調用不會做receiver的自動轉換;
15.反射:
t.Kind() == reflect.Struct 判斷是否是結構類型;
.()判定其結構類型,.(type)可以通過switch判斷;
v.Field(i).Interface()獲得其屬性的方法;
通過反射可以訪問、設置屬性(匿名屬性),調用方法(方法嵌套):
1>普通屬性:
讀:
訪問類型typeof,訪問屬性值valueof;
獲取field:直接訪問FieldByName,順序訪問FieldByIndex;
獲得field值:Interface()
寫:
reflect.ValueOf(傳入指針,否則只是拷貝,拷貝值無法編輯),返回值是指針,無法通過指針設置值;panic: reflect: reflect.Value.SetFloat using unaddressable value
v = v.Elem(),獲得原來數據的引用,直接設置數據即可;panic: reflect: call of reflect.Value.FieldByName on ptr Value
結構中只有被導出字段(首字母大寫)才是可設置的;panic: reflect: reflect.Value.SetString using value obtained using unexported field
2>匿名屬性:可以使用FieldByName、FieldByIndex
3>普通方法:
調用:
args := []reflect.Value{reflect.ValueOf("ss")}
v.Method(0).Call(args)
4>嵌套方法:嵌套時和屬性一樣,都可以直接調用
16.並發concurrency:
1>go執行
2>Channel:
通過消息來共享內存,channel是引用類型;
默認是阻塞同步的,make創建,close關閉,否則死鎖;
可設置單項或雙向通道,for range迭代;
可設置緩存大小,未被填滿之前不會阻塞:有緩存是異步的,無緩存是同步的;
並行運行時,可以使用channel、sync進行異步控制,讓主程序等待子程序執行完畢后結束;
WEB部分(beego框架):
1.controller 與view傳值
{{with .name}} {{end}}
{{range .name}} {{.}} {{end}}
2.view內置的模板函數:str2html
3.orm:增刪改查
所有操作函數都需要傳入結構體的指針