Golang随笔
結(jié)構(gòu)體是Todo,Todo{}代表空結(jié)構(gòu)體
新添加依賴后執(zhí)行 go mod tidy整理依賴
匿名變量不會分配內(nèi)存,所以匿名變量之間不存在重復聲明。
單引號表示字符, 雙引號表示字符串,反引號表示多行字符串
通過在?const?后跟一對圓括號定義一組常量的方式來實現(xiàn)枚舉
type-switch用于判斷某個 interface 變量中實際存儲的變量類型
接口類型斷言x.(T),且要求成員順序一樣;
json.unmarshal時數(shù)值型的 json 統(tǒng)一被解析為?float64;
switch中默認每個case都會有隱藏的break,如果想去掉break可使用fallthrough;
go的i++值是一條語句,不能賦值,且只有i++沒有++i。
unsafe.Sizeof是在編譯期求值,返回的是類型數(shù)據(jù)結(jié)構(gòu)的大小而不是其指向內(nèi)存的大小。
var str string = "hello" var str2 stringfmt.Println(unsafe.SizeOf(str), unsafe.SizeOf(str2)) string類型不是直接存的數(shù)據(jù),而是一個結(jié)構(gòu)體,用指針指向?qū)嶋H數(shù)據(jù)地址, 在64位機器。ptr和int結(jié)構(gòu)都是占用8字節(jié),所以兩個打印出來都是字節(jié)make([]string, 1, 2),len=1,cap=2;
make([]string, 2),len=2,cap=2
%p是指針的占位符;%+v是附帶打印結(jié)構(gòu)的key
// 比較是否是指針m := make(map[string]string, 4)fmt.Println(reflect.DeepEqual(reflect.Ptr, reflect.ValueOf(&m).Kind()))將函數(shù)作為參數(shù)變量或返回值的情況稱為function value。function value本質(zhì)上是一個指針,指向runtime.funcval結(jié)構(gòu)體,這個結(jié)構(gòu)體里只有一個地址,即函數(shù)指令的入口地址。閉包其實就是有捕獲列表的funcval結(jié)構(gòu)體,funcval加上偏移量可以找到每個捕獲的變量。
// 循環(huán)每秒執(zhí)行一次for range time.Tick(time.Second){fmt.Println("hah")}序列化:omitempty,如果是零值則忽略序列化該字段
反序列化:沒有的字段會賦予零值
提示gc釋放堆內(nèi)存:如使用new在heap上開辟空間,使用結(jié)束后把指針置為nil。
結(jié)構(gòu)體和數(shù)組作為復合類型,其零值以及能否比較、初始化、都是其內(nèi)部的元素決定的,且復合類型占用連續(xù)的內(nèi)存空間。
不能返回局部變量的地址,因為棧幀會被回收。
main?goroutine退出后(相當于進程結(jié)束),其他的工作goroutine也會隨之自動退出。
recover不能跨協(xié)程,會從panic點退出當前函數(shù)后繼續(xù)執(zhí)行。
`json:",inline"`??忽略這一層級的字段,直接調(diào)用下一層級,減少重復定義。應(yīng)該和直接不寫反引號效果一樣。
內(nèi)聯(lián)是一種編譯器優(yōu)化,用于將簡短函數(shù)的調(diào)用替換為函數(shù)體本身,可以消除函數(shù)調(diào)用本身的開銷,也使得編譯器能更高效地執(zhí)行其他的優(yōu)化策略。注釋//go:noinline會禁止Go編譯器對該函數(shù)進行內(nèi)聯(lián)。
go tool compile ?-m main.go可以查看是否內(nèi)聯(lián),內(nèi)存是否分配到了堆上。
空結(jié)構(gòu)體和零長數(shù)組(兩個復合類型)都僅僅是一個占位符,不占用空間,這里編譯器進行了優(yōu)化,如果結(jié)構(gòu)體或數(shù)組的unsafe.sizeof=0則直接返回zerobase。
runtime.KeepAlive 能保證變量不被 GC 所回收。
超時控制:請求時間過長用戶側(cè)可能已經(jīng)離開頁面,但是服務(wù)端還在消耗資源得到的結(jié)果沒有意義;
close(channel)只是用來告訴接受者沒有東西要發(fā)送了,并且channel和文件描述符不一樣,只是個對象而已可以自己gc掉,并不是必須close關(guān)閉的;
單引號表示byte類型或rune類型,雙引號表示字符串,反引號表示多行字符串;
for range會首先計算切片的長度,如果長度不滿足就不進入循環(huán);
接口到普通類型的轉(zhuǎn)換用-接口類型斷言;普通類型到普通類型的轉(zhuǎn)換用-類型轉(zhuǎn)換;只要有部分字段對應(yīng)-序列化和反序列化;
前端(VO)<-->controller(DTO)<-->service(BO)<-->dao(PO)<-->數(shù)據(jù)庫(DAO)
VO:一般用于前端展示用
DTO:用于數(shù)據(jù)傳遞(接口入?yún)⒑徒涌诜祷刂刀伎梢?#xff09;
?
總結(jié)
- 上一篇: 社区的代码规范及e2e测试
- 下一篇: 你以为工厂模式很简单,可能是因为你懂的只