1.遞迴
遞迴:函式自己呼叫自己,適合處理那種問題相同、問題規模越來越小的場景。
注意:遞迴一定要有乙個明確的退出條件,否則很容易成死迴圈。
計算n的階乘
func
f(n uint64
)uint64
return n*
f(n-1)
}func
main()
上台階問題:
n個台階,一次可以走1步,也可以走兩步,有多少種走法。(遞迴實現)
func
taijie
(n uint64
)uint64
if n ==
2return
taijie
(n-1)+
taijie
(n-2
)//最後剩下一步之前有多少種走法+最後剩下兩步之前有多少種走法
}func
main()
2.結構體
結構體指標:
結構體是值型別的,賦值的時候都是拷貝。go語言中通過struct
來實現物件導向。
當結構體字段較多時,為了減少記憶體消耗可以傳遞結構體指標。
type後面跟的是型別:go語言種可以使用type
關鍵字來定義自定義型別。
可以給自定義型別加方法,但是不能給包裡面的型別新增方法,只能給自己包裡的型別新增方法。
type myint int
//自定義型別:myint是一種新型別,具有int的特性
type yourint =
int//型別別名:yourint只會在**中存在,編譯完成時並不會有yourint型別;byte和rune都屬於型別別名
func
main()
n的型別是:main.myint,值為:100m的型別是:int,值為:200
匿名結構體:多用於臨時場景。
go語言中函式傳參永遠傳的是拷貝。
指標型別結構體:
可以通過new
關鍵字對結構體進行例項化。需要注意的是:在go語言中支援對結構體指標直接使用.
來訪問結構體成員。使用&
對結構體取位址操作相當於對該結構體型別進行了一次new
例項化。沒有初始化的結構體,其成員變數都是對應其型別的零值。
使用值的列表初始化:
p :=
&person
fmt.
printf
("%#v"
,p)//&main.person
注意:
a. 必須初始化結構體的所有字段;
b. 初始值的填充順序必須與字段在結構體中的宣告順序一致。
c.該方式不能和鍵值對初始化方式混用。
方法和接收者:
a. 方法的定義格式如下:
func
(接收者變數 接收者型別)方法名(引數)
(返回引數)
b. 方法是作用於特定型別的函式
c. 接收者表示的是呼叫該方法的具體型別變數,多用型別名首字母小寫表示。
d. 接收者分為:指標型別的接收者、值型別的接收者
什麼時候應該使用指標型別接收者?
i. 需要修改接收者中的值;
ii. 接收者是拷貝代價比較大的大物件;
iii. 保證一致性,如果有某個方法使用了指標接收者,那麼其他的方法也應該使用指標接收者。
go中的建構函式:約定成俗用new開頭
type dog struct
//建構函式
func
newdog
(name string
) dog
}//方法
//接收者
func
(d dog)
run(
)func
main()
3.json
序列化:將結構體變數—>json字串。byte,err:=json.marshal(結構體變數)
反序列化:將json字串串—>結構體變數。err=json.unmarshal(btye(str字串),&結構體變數)
注意:
結構體內部的字段首字母要大寫,否則訪問不到。如果前端要求變數名為小寫的,可以使用tag標籤。
反序列化時要傳遞指標。
日常學習總結
關於vb中的把字串 日期型 數值型 賦值給某個變數的寫法 eg dim m1,r 此處我並不清楚 m1 到底是什麼型別 所以vb會自動匹配其應該所屬的型別,這是vb的一點強大之處 m select fitemid from t item where fitemclassid 3 and fnumbe...
工作日常總結學習
主要記錄工作當中一些基礎知識的累積,方便日後複習。我們把系統時鐘配置分為七個步驟,分別用標號 表示,詳細過程為 時鐘源引數設定 hse 或者 hsi 配置。這裡我們選擇 hse 為時鐘源,所以我們之前必須 在 rcc 配置中我們開啟 hse。時鐘源選擇 hse 還是 hsi。這裡我們配置選擇器選擇 ...
總結 日常總結
最近變得浮躁了,學不進了,那就寫總結吧。關於刷題 從去年十一月份到現在,感覺唯一堅持的意見事情就是刷力扣了。四個多月,寫了六百多道題,大概有四五題一天,然後也在堅持參加周賽。很多時候,有些事情成了習慣,那麼也就不需要去堅持了。比如說現在,每天都是先把每日一題和劍指 offer 的任務完成了再開始做其...