golang slice使用不慎導致的問題

2022-07-08 19:30:14 字數 940 閱讀 1815

go語言中切片slice是方便且好用的強大資料結構,但是使用的時候需要注意,不然容易出問題,最近因為遇到了乙個slice的使用問題,比較典型。

有乙個功能需求,使用者需要獲取1-20的不重複隨機序列。

由於是需要固定的1-20共20個不同數字,所以直接定義好了唯一序列如下:

var(

originalnumbers = uint32

)

因為每個使用者獲取的資料的序列都需要隨機打亂,實現的邏輯如下:

func shuffle(list uint32) uint32 

return list

}func getoriginalnumbers() uint32

func getrandomnumbers(cardtype int) uint32

通過仔細分析,從以上的邏輯其實是可以發現問題的,只是寫**的時候疏忽導致沒有主要到潛在問題。執行的時候發現邏輯不正確,偶爾有使用者得到的序列是有重複的數字。

從原始資料的初始化來看,數字是1-20初始化到slice裡面的,絕對不會出現重複。仔細看了getrandonumbers和shuffle打亂邏輯是存在併發訪問問題的。

首先originalnumbers是乙個slice,引數傳遞slice時僅僅是傳遞的切片的指標,並非複製乙份切片。所以在併發的情況下,每個使用者的getrandomnumbers都會獲取到同乙個slice位址。而shuffle函式會對得到切片資料進行寫操作(資料打亂),當出現併發寫問題的時候,資料發生錯亂就不足為奇了。

這個問題本質就是併發寫問題,只需要將資料分離即可解決問題。

func getoriginalnumbers() uint32
這是乙個很典型的slice誤用問題,slice是乙個資料結構,他會指向底層真正的記憶體資料塊,可以認為slice傳遞的是記憶體的指標。

MVC分頁使用(不使用控制項)

分頁是專案開發中最常用的功能 四要素 1.總資料數量 totalcount 2.總頁碼 pagecount 3 當前頁碼 pageindex 4 每頁顯示的資料數量 pagesize 分頁在專案中肯定是不止乙個頁面去使用的,所以效率方面應該將分頁的方法寫入 common共用的類方法中,而這個成員變數...

vi使用 不斷更新

1.刪除操作 命令模式使用 x刪除游標處的單個字元 dd刪除游標所在行 dw刪除當前字元到單詞尾包括空格的所有字元 x例如3x刪除游標處向右的三個字元 dd例如3dd從當前行開始向下刪除三行文字 2.撤銷操作 u命令取消最近一次的操作,可以使用多次來恢復原有的操作 u取消所有操作 ctrl r可以恢...

mysql使用(不適用)索引

表的主關鍵字 表的字段唯一約束 直接條件查詢的字段 查詢中與其它表關聯的字段 查詢中排序的字段 查詢中統計或分組統計的字段 不建或少建索引 表記錄太少 採用索引去訪問記錄的話,首先需訪問索引表,再通過索引表訪問資料表,一般索引表與資料表不在同乙個資料塊,這種情況下至少要往返讀取資料塊兩次,而不用索引...