// 三種阻塞方法
defer
func()
}()defer
func()
}()defer
func()
()// 常見坑
/* 1.不定引數是空介面型別時,傳介面陣列和變參是都可以通過,但是得到的引數不同
2.陣列是值傳遞
3.map遍歷是無序的。
4.命名的返回值內,同名的區域性變數被遮蔽。
5.recover必須在defer函式中執行,直接呼叫是無效的
6.mian提前退出,goroutine無法保證完成任務
7.睡眠不能保證goroutine執行完成
8.獨佔cpu導致其他goroutine餓死, runtime.gomaxporocs(1) runtime.gosched()
9.goroutine和main是併發不是順序。
10.defer的for迴圈閉包引用會導致拿到的都是最後乙個變數值
11.for迴圈內部defer會導致資源延遲釋放,可以在for迴圈內新增乙個區域性函式來解決延遲問題。
12.切片引用會導致整個陣列被鎖定。當切片引用大陣列的小部分內容時,會導致大陣列久久不能釋放。解決辦法就是轉殖資料。
13.空指標和空介面不等價。特別是返回error時,自定義的錯誤型別更要注意區別。
14.記憶體位址會發生變化,指標會做同步,但非指標型別的uintptr不會對此變化做同步。同理cgo不能儲存go的物件位址。
15.死迴圈的goroutine無法釋放引用的資源,使用context可以使不用的goroutine釋放。避免goroutine洩露。
*/// 面向併發的記憶體模型
/* 1.一般系統級別的執行緒固定大小棧:2m;goroutine以2/4k啟動,動態伸縮可達1g。
2.go有自己的排程器,以n個執行緒排程m個goroutine。
3.goroutine是半搶占式的協作排程。發生在使用者態。
4.只有當前goroutine發生阻塞是才會導致排程。
5.runtime.gomaxprocs(x)控制當前正常非阻塞goroutine的系統執行緒數目。
6.原子操作:
併發程式設計中 最小的切不可並行化 的操作
sync.mutex通過互斥可以保證原子性:麻煩且效率低
sync/atomic
sync.once:單件模式
7.順序一致性記憶體模型:
同步原語確定兩個事件的順序。
channel
sync.mutex
可通過cannel的快取大小控制goroutine的併發大小。
*/// 常見的併發模式
/* csp:通訊順序程序-同步通訊
並行一般是簡單的大量重複,如gpu對影象的大量平行計算。
併發:併發完全可以順序執行,只有真正的多核cpu上才有可能著呢張的同時執行。
併發程式設計中對共享資源的控制:go提倡不要通過共享記憶體通訊,而是通過通訊來共享記憶體。
雖然引用計數這種併發可以通過原子操作很好的實現,但是通過channel來控制訪問可以寫成更加簡潔正確的程式。
生產者消費者模型:直接使用channel一句話完成:生產者只寫,消費者range
發布訂閱模型
控制併發數:帶快取的channel,而且可以通過獲取channel的空閒數來反映併發使用率。
goroutine安全退出:
chan bool來控制goroutine退出,sync.waitgroup來讓main等待goroutine的退出時的清理動作。
context包用於處理單個請求的多個goroutine之間的請求域的資料、超時、退出等操作。context可以代替cannel和waitgroup組合。
*/// 錯誤和異常
/* 為了增加程式的健壯性,防止外部引用的包異常導致我們的程式異常。使用recover統一獲取panic
errors.wrap和errors.wrapwithcode是對error的二次包裝
errors.tojson/fromjson可以通過json網路傳播error
error是介面,給該介面返回空指標,外部接收到的介面不是nil,而是個空 指標的介面。
錯誤:func returnerr()error
return p //此時就算p是nil,外部拿到的返回值也不是nil,而是乙個有值的介面,介面值是空指標
} 改正:func returnerr()error
return nil
} recover必須在panic中才能捕獲異常。
recover被二次包裝在panic中呼叫也是無效的。defer func()()}()
兩個defer巢狀,內部的defer中呼叫recover也是無效的。 defer func()()}()
defer直接呼叫recover也是無效的。 defer recover()
panic(nil)會導致無法捕獲異常
有效的呼叫:
defer func(recover()){}()
panic(1)
*/
常見問題 朗動常見問題
常見問題一 方向盤變沉 檢查胎壓是否正常,輪胎是否過度磨損。助力幫浦不工作,前輪氣壓低。冬天的話,冷車在冬天助力油比較稠,方向會重一點。檢查轉向助力油。1 應該是是助力系統有問題或則助力潤滑油有問題。2 如果你在駕車時感覺方向盤變緊,汽車偏向一側,需要檢查輪胎,或進行車輪平衡 定位。在這些問題剛剛發...
面試常見問題 1 this的常見問題
this 的含義 this關鍵字是乙個非常重要的語法點。毫不誇張地說,不理解它的含義,大部分開發任務都無法完成。前一章已經提到,this可以用在建構函式之中,表示例項物件。除此之外,this還可以用在別的場合。但不管是什麼場合,this都有乙個共同點 它總是返回乙個物件。簡單說,this就是屬性或方...
Spring常見問題
1 利用spring框架程式設計,console列印出log4j warn please initialize the log4j system properly?lupa開源社群 u i w.d t 說 明你的log4j.properties沒有配置。請把log4j.properties放到工程的...