Golang常見問題

2021-10-01 22:59:48 字數 2509 閱讀 6125

// 三種阻塞方法

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放到工程的...