go原始碼分享 Ascii字元包含判斷

2021-10-23 11:10:38 字數 1221 閱讀 4799

最近換工作,暫時離開了世界上最好的語言,成為了一名 golanger (這好象是乙個 web 框架的名字),這一次打算養成良好的習慣,那就從寫部落格開始吧。

正在琢磨自己用 go 實現乙個指令碼語言,寫詞法分析的時候,需要匹配字串的功能,既然編譯器都自己寫了,這也自己寫乙個吧,去研究了下 go 的實現,發現設計的很巧妙,所以分享一下,美中不足的是只適用於 ascii 碼

type asciiset [8]

uint32

const runeself =

0x80

// 判斷是否包含

func

(as *asciiset)

contains

(c rune

)bool

// 生成 ascii 雜湊表

func

makeasciiset

(chars string

)(as asciiset, ok bool

) as[c>>5]

|=1<<

uint

(c&31)}

return as,

true

}

type asciiset [8]

uint32

asciiset這是乙個分了 8 個桶的雜湊表(位圖),用於儲存匹配串包含的字元集合

匹配串輸入後,將會被按位儲存在asciiset

下面這行**,會對所有包含非 ascii字元的串直接返回false

if c >= utf8.runeself
下面這行**可以看作乙個雜湊演算法。

1

<<

uint

(c&31

)

會把單個字元對應到乙個 32位 的點陣圖上面,

(as[c>>5]

&(1<<

uint

(c&31))

)!=0

從字元對應的桶中取出位圖,然後檢視是否存在

asciiset是其中的關鍵,但是也由於其大小限制加上以為操作,導致只適用於基礎ascii,

當然,稍作修改可以適用於擴充套件 ascii,但泛用性依然有問題,不過對於我來說已然足夠。

原始碼分享 HOOK API

此原始碼以hook自己程式中的messageboxw函式為例 然而hook自己程式中的函式並沒有什麼卵用,但是對想學習hook技術卻難以入門的人來說是乙個很大的幫助 如果需要hook其他程序的api的話還需要學習關於dll注入等相關知識 本原始碼是根據 改寫原文是使用了彙編語句,呃,在qt中一直沒找...

mysql原始碼包多大 MySQL原始碼包安裝

root node2 groupadd g 27 mysql root node2 useradd u 27 mysql g mysql s sbin nologin root node2 yum y install make cmake bison gcc c cmake ncurses ncur...

原始碼包安裝mysql 原始碼包安裝MySQL

mysql安裝方式 1.二進位制安裝2.原始碼包安裝3.rpm包安裝 一.原始碼包安裝 原始碼包安裝比較繁瑣,但是更加靈活,可以按自己需求配置 root db03 wget 2.安裝需要的依賴包 root db03 yum install y ncurses devel libaio devel g...