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