go語言隨機提取,go生成隨機字符串

golang 讀寫二進制文件

我們需要對一些文本進行"明文加密",何為"明文加密"?

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名注冊虛擬主機、營銷軟件、網站建設、商城網站維護、網站推廣。

從一些錯亂的數據中,提取我們想要的數據.

生成錯亂的數據(可以隨機生成)

只需從上面的字符串提取數字即可,45.89.0.8

這里只是舉個簡單例子

這樣就會該go文件同級目錄生成bin文件

并未使用binary.Read()方法

讀取到的文本

再根據自己的規則去提取該字符中你想要的數據即可.

golang map的元素遍歷為什么是隨機的

Map是隨機存儲的,好像是按內存塊的大小放數據。這樣存儲效率高。但檢索效率低。List是會重新劃分存儲空間,保證連續存儲,存的效率低,檢索效率高。大概是這個意思,具體的,準確、詳細的自己google下。

hashCode() 方法得到其 hashCode 值——每個 Java 對象都有 hashCode() 方法,都可通過該方法獲得它的 hashCode 值。得到這個對象的 hashCode 值之后,系統會根據該 hashCode 值來決定該元素的存儲位置。

設置了首尾倒置函數,也會出現這種類似情況。還有,你要注意:map中不允許存在重復的鍵名,你也可以使用其他的方式來實現,比如List,排序的話還得靠你自己來實現了。

golang map源碼淺析

golang 中 map的實現結構為: 哈希表 + 鏈表。 其中鏈表,作用是當發生hash沖突時,拉鏈法生成的結點。

可以看到, []bmap 是一個hash table, 每一個 bmap是我們常說的“桶”。 經過hash 函數計算出來相同的hash值, 放到相同的桶中。 一個 bmap中可以存放 8個 元素, 如果多出8個,則生成新的結點,尾接到隊尾。

以上是只是靜態文件 src/runtime/map.go 中的定義。 實際上編譯期間會給它加料 ,動態地創建一個新的結構:

上圖就是 bmap的內存模型, HOB Hash 指的就是 top hash。 注意到 key 和 value 是各自放在一起的,并不是 key/value/key/value/... 這樣的形式。源碼里說明這樣的好處是在某些情況下可以省略掉 padding 字段,節省內存空間。

每個 bmap設計成 最多只能放 8 個 key-value 對 ,如果有第 9 個 key-value 落入當前的 bmap,那就需要再構建一個 bmap,通過 overflow 指針連接起來。

map創建方法:

我們實際上是通過調用的 makemap ,來創建map的。實際工作只是初始化了hmap中的各種字段,如:設置B的大小, 設置hash 種子 hash 0.

注意 :

makemap 返回是*hmap 指針, 即 map 是引用對象, 對map的操作會影響到結構體內部 。

使用方式

對應的是下面兩種方法

map的key的類型,實現了自己的hash 方式。每種類型實現hash函數方式不一樣。

key 經過哈希計算后得到hash值,共 64 個 bit 位。 其中后B 個bit位置, 用來定位當前元素落在哪一個桶里, 高8個bit 為當前 hash 值的top hash。 實際上定位key的過程是一個雙重循環的過程, 外層循環遍歷 所有的overflow, 內層循環遍歷 當前bmap 中的 8個元素 。

舉例說明: 如果當前 B 的值為 5, 那么buckets 的長度 為 2^5 = 32。假設有個key 經過hash函數計算后,得到的hash結果為:

外層遍歷bucket 中的鏈表

內層循環遍歷 bmap中的8個 cell

建議先不看此部分內容,看完后續 修改 map中元素 - 擴容 操作后 再回頭看此部分內容。

擴容前的數據:

等量擴容后的數據:

等量擴容后,查找方式和原本相同, 不多做贅述。

兩倍擴容后的數據

兩倍擴容后,oldbuckets 的元素,可能被分配成了兩部分。查找順序如下:

此處只分析 mapaccess1 ,。 mapaccess2 相比 mapaccess1 多添加了是否找到的bool值, 有興趣可自行看一下。

使用方式:

步驟如下:

擴容條件 :

擴容的標識 : h.oldbuckets != nil

假設當前定位到了新的buckets的3號桶中,首先會判斷oldbuckets中的對應的桶有沒有被搬遷過。 如果搬遷過了,不需要看原來的桶了,直接遍歷新的buckets的3號桶。

擴容前:

等量擴容結果

雙倍擴容會將old buckets上的元素分配到x, y兩個部key 1 B == 0 分配到x部分,key 1 B == 1 分配到y部分

注意: 當前只對雙倍擴容描述, 等量擴容只是重新填充了一下元素, 相對位置沒有改變。

假設當前map 的B == 5,原本元素經過hash函數計算的 hash 值為:

因為雙倍擴容之后 B = B + 1,此時B == 6。key 1 B == 1, 即 當前元素rehash到高位,新buckets中 y 部分. 否則 key 1 B == 0 則rehash到低位,即x 部分。

使用方式:

可以看到,每一遍歷生成迭代器的時候,會隨機選取一個bucket 以及 一個cell開始。 從前往后遍歷,再次遍歷到起始位置時,遍歷完成。

golang連續生成隨機數

const NUM int = 100

for i := 0; i NUM; i += 1 {

rand.Seed(int64(i))

fmt.Printf("%d\t", rand.Int63n(int64(NUM)))

}

其實在循環里面這點時間間隔,納秒也是跟不上的。

還有,你用sleep的方法肯定是不能接受的!!!

GO GOLANG 生成范圍隨機數

math/rand 中的所有整數函數都生成非負數.

示例 main.go

執行

同理,需要int64 int32類型的隨機數只要修改隨機函數

但是需要注意 math/rand 幾個函數的取值區間!如Intn的范圍[0, n)。[0,20),20會取不到

我自己的需求這樣寫已足夠

【golang詳解】go語言GMP(GPM)原理和調度

Goroutine調度是一個很復雜的機制,下面嘗試用簡單的語言描述一下Goroutine調度機制,想要對其有更深入的了解可以去研讀一下源碼。

首先介紹一下GMP什么意思:

G ----------- goroutine: 即Go協程,每個go關鍵字都會創建一個協程。

M ---------- thread內核級線程,所有的G都要放在M上才能運行。

P ----------- processor處理器,調度G到M上,其維護了一個隊列,存儲了所有需要它來調度的G。

Goroutine 調度器P和 OS 調度器是通過 M 結合起來的,每個 M 都代表了 1 個內核線程,OS 調度器負責把內核線程分配到 CPU 的核上執行

模型圖:

避免頻繁的創建、銷毀線程,而是對線程的復用。

1)work stealing機制

當本線程無可運行的G時,嘗試從其他線程綁定的P偷取G,而不是銷毀線程。

2)hand off機制

當本線程M0因為G0進行系統調用阻塞時,線程釋放綁定的P,把P轉移給其他空閑的線程執行。進而某個空閑的M1獲取P,繼續執行P隊列中剩下的G。而M0由于陷入系統調用而進被阻塞,M1接替M0的工作,只要P不空閑,就可以保證充分利用CPU。M1的來源有可能是M的緩存池,也可能是新建的。當G0系統調用結束后,根據M0是否能獲取到P,將會將G0做不同的處理:

如果有空閑的P,則獲取一個P,繼續執行G0。

如果沒有空閑的P,則將G0放入全局隊列,等待被其他的P調度。然后M0將進入緩存池睡眠。

如下圖

GOMAXPROCS設置P的數量,最多有GOMAXPROCS個線程分布在多個CPU上同時運行

在Go中一個goroutine最多占用CPU 10ms,防止其他goroutine被餓死。

具體可以去看另一篇文章

【Golang詳解】go語言調度機制 搶占式調度

當創建一個新的G之后優先加入本地隊列,如果本地隊列滿了,會將本地隊列的G移動到全局隊列里面,當M執行work stealing從其他P偷不到G時,它可以從全局G隊列獲取G。

協程經歷過程

我們創建一個協程 go func()經歷過程如下圖:

說明:

這里有兩個存儲G的隊列,一個是局部調度器P的本地隊列、一個是全局G隊列。新創建的G會先保存在P的本地隊列中,如果P的本地隊列已經滿了就會保存在全局的隊列中;處理器本地隊列是一個使用數組構成的環形鏈表,它最多可以存儲 256 個待執行任務。

G只能運行在M中,一個M必須持有一個P,M與P是1:1的關系。M會從P的本地隊列彈出一個可執行狀態的G來執行,如果P的本地隊列為空,就會想其他的MP組合偷取一個可執行的G來執行;

一個M調度G執行的過程是一個循環機制;會一直從本地隊列或全局隊列中獲取G

上面說到P的個數默認等于CPU核數,每個M必須持有一個P才可以執行G,一般情況下M的個數會略大于P的個數,這多出來的M將會在G產生系統調用時發揮作用。類似線程池,Go也提供一個M的池子,需要時從池子中獲取,用完放回池子,不夠用時就再創建一個。

work-stealing調度算法:當M執行完了當前P的本地隊列隊列里的所有G后,P也不會就這么在那躺尸啥都不干,它會先嘗試從全局隊列隊列尋找G來執行,如果全局隊列為空,它會隨機挑選另外一個P,從它的隊列里中拿走一半的G到自己的隊列中執行。

如果一切正常,調度器會以上述的那種方式順暢地運行,但這個世界沒這么美好,總有意外發生,以下分析goroutine在兩種例外情況下的行為。

Go runtime會在下面的goroutine被阻塞的情況下運行另外一個goroutine:

用戶態阻塞/喚醒

當goroutine因為channel操作或者network I/O而阻塞時(實際上golang已經用netpoller實現了goroutine網絡I/O阻塞不會導致M被阻塞,僅阻塞G,這里僅僅是舉個栗子),對應的G會被放置到某個wait隊列(如channel的waitq),該G的狀態由_Gruning變為_Gwaitting,而M會跳過該G嘗試獲取并執行下一個G,如果此時沒有可運行的G供M運行,那么M將解綁P,并進入sleep狀態;當阻塞的G被另一端的G2喚醒時(比如channel的可讀/寫通知),G被標記為,嘗試加入G2所在P的runnext(runnext是線程下一個需要執行的 Goroutine。), 然后再是P的本地隊列和全局隊列。

系統調用阻塞

當M執行某一個G時候如果發生了阻塞操作,M會阻塞,如果當前有一些G在執行,調度器會把這個線程M從P中摘除,然后再創建一個新的操作系統的線程(如果有空閑的線程可用就復用空閑線程)來服務于這個P。當M系統調用結束時候,這個G會嘗試獲取一個空閑的P執行,并放入到這個P的本地隊列。如果獲取不到P,那么這個線程M變成休眠狀態, 加入到空閑線程中,然后這個G會被放入全局隊列中。

隊列輪轉

可見每個P維護著一個包含G的隊列,不考慮G進入系統調用或IO操作的情況下,P周期性的將G調度到M中執行,執行一小段時間,將上下文保存下來,然后將G放到隊列尾部,然后從隊列中重新取出一個G進行調度。

除了每個P維護的G隊列以外,還有一個全局的隊列,每個P會周期性地查看全局隊列中是否有G待運行并將其調度到M中執行,全局隊列中G的來源,主要有從系統調用中恢復的G。之所以P會周期性地查看全局隊列,也是為了防止全局隊列中的G被餓死。

除了每個P維護的G隊列以外,還有一個全局的隊列,每個P會周期性地查看全局隊列中是否有G待運行并將其調度到M中執行,全局隊列中G的來源,主要有從系統調用中恢復的G。之所以P會周期性地查看全局隊列,也是為了防止全局隊列中的G被餓死。

M0

M0是啟動程序后的編號為0的主線程,這個M對應的實例會在全局變量rutime.m0中,不需要在heap上分配,M0負責執行初始化操作和啟動第一個G,在之后M0就和其他的M一樣了

G0

G0是每次啟動一個M都會第一個創建的goroutine,G0僅用于負責調度G,G0不指向任何可執行的函數,每個M都會有一個自己的G0,在調度或系統調用時會使用G0的棧空間,全局變量的G0是M0的G0

一個G由于調度被中斷,此后如何恢復?

中斷的時候將寄存器里的棧信息,保存到自己的G對象里面。當再次輪到自己執行時,將自己保存的棧信息復制到寄存器里面,這樣就接著上次之后運行了。

我這里只是根據自己的理解進行了簡單的介紹,想要詳細了解有關GMP的底層原理可以去看Go調度器 G-P-M 模型的設計者的文檔或直接看源碼

參考: ()

()

文章題目:go語言隨機提取,go生成隨機字符串
轉載注明:http://m.kartarina.com/article6/heiiog.html

成都網站建設公司_創新互聯,為您提供建站公司ChatGPT響應式網站用戶體驗移動網站建設軟件開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

手機網站建設
主站蜘蛛池模板: 精品人妻无码区在线视频| 国产成人无码a区在线观看视频免费| 亚洲成av人片在线观看无码不卡| 蜜色欲多人AV久久无码| 久久亚洲AV成人无码国产电影| 亚洲a∨无码一区二区| 国产精品无码久久综合| 在线观看亚洲AV每日更新无码| 成人无码网WWW在线观看| 亚洲日韩一区二区一无码| 国产精品白浆无码流出| 国产免费无码一区二区| 亚洲av纯肉无码精品动漫| 波多野42部无码喷潮在线| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 蜜桃臀AV高潮无码| 无码人妻精品丰满熟妇区| 精品久久久无码21p发布| 人妻丰满熟妇A v无码区不卡| 日韩人妻无码精品系列| 在线观看无码AV网址| 久久亚洲精品AB无码播放| 亚洲 无码 在线 专区| 精品人妻无码一区二区三区蜜桃一| 国产AV无码专区亚洲AV手机麻豆| a级毛片无码免费真人| 亚洲AV综合色区无码二区偷拍 | 无码人妻一区二区三区av| 欧洲Av无码放荡人妇网站| 久久久久久亚洲av成人无码国产 | 免费一区二区无码视频在线播放| 无码精品黑人一区二区三区| 国产精品无码一区二区三级| 国产成人无码精品久久久露脸| 久久亚洲AV成人无码电影| 人妻系列无码专区无码中出| 亚洲日韩精品A∨片无码| 大桥久未无码吹潮在线观看| 少妇无码太爽了不卡视频在线看 | 午夜精品久久久久久久无码| 国产精品无码aⅴ嫩草|