Golang下的命令行色彩使用庫, 擁有豐富的色彩渲染輸出,通用的API方法,兼容Windows系統(tǒng)
創(chuàng)新互聯(lián)專注于阜寧企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),成都做商城網(wǎng)站。阜寧網(wǎng)站建設(shè)公司,為阜寧等地區(qū)提供建站服務(wù)。全流程按需求定制設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
倉庫名稱 :color
標星(star) :221 (不錯哦,潛力股項目)
標星趨勢
拷貝(fork) :21
貢獻人數(shù) :3
倉庫大小 :1 MB
主要開發(fā)語言:Go
語言分布:Go:99.75%、Batchfile:0.25%
代碼提交周期分布 :
作者動態(tài) :
2星
Golang下的命令行色彩使用庫, 擁有豐富的色彩渲染輸出,通用的API方法,兼容Windows系統(tǒng)
功能特色
程序員新視界:分享有趣、有料的程序員話題,每天進步一點點。
最近在看左神新書 《Go 語言設(shè)計與實現(xiàn)》的垃圾收集器時產(chǎn)生一個疑惑,花了點時間搞清楚了記錄一下。
Go 語言垃圾回收的實現(xiàn)使用了標記清除算法,將對象的狀態(tài)抽象成黑色(活躍對象)、灰色(活躍對象中間狀態(tài))、白色(潛在垃圾對象也是所有對象的默認狀態(tài))三種,注意沒有具體的字段標記顏色。
整個標記過程就是把白色對象標黑的過程:
1.首先將 ROOT 根對象(包括全局變量、goroutine 棧上的對象等)放入到灰色集合
2.選一個灰色對象,標成黑色,將所有可達的子對象放入到灰色集合
3.重復(fù)2的步驟,直到灰色集合中為空
下圖是書上的插圖,看上去是一個典型的深度優(yōu)先搜索的算法。
下圖是劉丹冰寫的《Golang 修養(yǎng)之路》的插圖,看上去是一個典型的廣度優(yōu)先搜索的算法。
我疑惑的點在于這個標記過程是深度優(yōu)先算法還是廣度優(yōu)先算法,因為很多文章博客對此都沒有很清楚的說明,作為學習者這種細節(jié)其實也不影響對整個 GC 流程的理解,但是這種細節(jié)我非常喜歡扣:)
對著書和源碼摸索著大致找到了一個結(jié)果是深度優(yōu)先。下面看下大致的過程,源碼基于1.15.2版本:
gcStart 是 Go 語言三種條件觸發(fā) GC 的共同入口
啟動后臺標記任務(wù)
為每個處理器創(chuàng)建用于執(zhí)行后臺標記任務(wù)的 Goroutine
上面休眠的 G 會在調(diào)度循環(huán)中檢查并喚醒執(zhí)行
執(zhí)行標記
gcw 是每個 P 獨有的所以不用擔心并發(fā)的問題 和 GMP、mcache 一樣設(shè)計,減少鎖競爭
嘗試在全局列表中獲取一個不為空的 buf
這是官方實現(xiàn)的無鎖隊列:)漲見識了,for 循環(huán)加原子操作實現(xiàn)棧的 pop
到這里從灰色集合中獲取待掃描的對象邏輯說完了。找到對象了接著就是 scanobject(b, gcw) 了,里面有兩段邏輯要注意
根據(jù)索引位置找到對象進行標色
嘗試存入 gcwork 的緩存中,或全局隊列中
無鎖隊列,for 循環(huán)加原子操作實現(xiàn)棧的 push
到這里把灰色對象標黑就完成了,又放回灰色集合接著掃下一個指針。
Go 語言設(shè)計與實現(xiàn) 垃圾收集器
Golang三色標記+混合寫屏障GC模式全分析
上一章節(jié)介紹了使用echo啟動一個http服務(wù)器并提供一個簡單的GET接口,這一章對請求與響應(yīng)做一下詳細的講解。
了解請求與響應(yīng)之前首先要知道ehco框架提供了一個Context接口,Context 表示當前 HTTP 請求的上下文,我們需要知道的是Context的實現(xiàn)結(jié)構(gòu)體context,context中包含了請求(request)、響應(yīng)(response)以及參數(shù)等結(jié)構(gòu)體,context是一個內(nèi)部結(jié)構(gòu)體,但是對外提供了訪問的方法,我們可以在開發(fā)中使用context提供的方法做很多事情,比如獲取請求路徑、客戶端ip、請求參數(shù)等等。
request是包含了當前請求信息的結(jié)構(gòu)體,我們從中可以獲取到前后端約定好的參數(shù)來作出相應(yīng)的業(yè)務(wù)邏輯,這下面開始模擬請求
首先模擬一個添加用戶的POST請求,這里使用了c.bind()這個方法,這個方法起到的作用是把表單參數(shù)或者JSON參數(shù)綁定至對應(yīng)的結(jié)構(gòu)體(這里必須是指針類型),字段需要一一對應(yīng),也就是說前端需要傳遞的表單或JSON參數(shù)名為name、age、gender才能綁定到結(jié)構(gòu)體中。
接下來模擬一個GET請求用來獲取用戶信息
response是包含了返回信息的結(jié)構(gòu)體,echo提供了多種類型的返回結(jié)果
上面編寫了處理請求的handler,這里介紹一下如何把handler注冊到路由中,這里對應(yīng)的就是上面handler。
1.
平鋪水印圖像 一般來說,水印圖會比要加載的圖片要小很多,所以我們采用的方式一般是把水印圖片平鋪在現(xiàn)有圖像上。 將水印圖片鋪滿整個屏幕,每個水印之間保留一些像素點。 具體思路為 1.獲取原圖尺寸
2.
獲取水印圖尺寸
3.
遍歷原圖尺寸,給出第一個偏移量,初始化第一個水印圖的位置
4.
設(shè)定每個水印圖的x軸偏移量,在寫入水印+偏移量之后,判斷第一行是否寫入完成