最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用go實(shí)現(xiàn)刪除sql里面的注釋和字符串功能(demo)

 更新時(shí)間:2020年11月30日 10:07:06   作者:皇家救星  
這篇文章主要介紹了使用go實(shí)現(xiàn)刪除sql里面的注釋和字符串功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

項(xiàng)目里面有一個(gè)需求,要對(duì)sql進(jìn)行簡(jiǎn)單的語(yǔ)法分析

為了避免sql里面的字符串和注釋對(duì)語(yǔ)法分析做干擾,我寫(xiě)了一個(gè)java函數(shù),對(duì)sql進(jìn)行修剪,刪除里面字符串和注釋?zhuān)每崭翊?br /> 周末閑著沒(méi)事,我用go重新實(shí)現(xiàn)了這個(gè)功能,感覺(jué)應(yīng)該會(huì)有后來(lái)人可以用上

說(shuō)明:
sql里面的注釋有兩種單行注釋和多行注釋?zhuān)渲袉涡凶⑨屢?-開(kāi)頭,以\n結(jié)尾,多行注釋以/開(kāi)頭,以/結(jié)尾
sql字符串是以'開(kāi)頭,'結(jié)尾,但特別的地方是連續(xù)兩個(gè)單引號(hào)是代表一個(gè)單引號(hào)而不是字符串結(jié)束標(biāo)志

關(guān)鍵函數(shù)如下:

`
/**

將字節(jié)數(shù)組里面注釋和字符串,用空格替換 rangeBeg和rangeEnd是數(shù)組元素起始位置 左閉右開(kāi)
*/
func TrimSqlByteArray(sql []byte, rangeBeg int, rangeEnd int) []byte {
sqlLength := rangeEnd - rangeBeg - 1;
//刪除注釋或者字符串后 用空格填充 必免因刪除導(dǎo)致粘連改變sql語(yǔ)義
const chPad = ' '

//結(jié)果切片,預(yù)分配空間為入?yún)ql長(zhǎng)度一半
result := make([] byte, 0, sqlLength / 2)

//本字符類(lèi)型
var charType int = NORMAL;
for i := rangeBeg; i < rangeEnd; i++ {
/*
*utf8編碼不影響判斷
//跳過(guò)非英文字符
if sql[i] & 0x80 != 0 {
//utf8編碼:UTF-8是一種變長(zhǎng)字節(jié)編碼方式。對(duì)于某一個(gè)字符的UTF-8編碼,如果只有一個(gè)字節(jié)則其最高二進(jìn)制位為0;
//如果是多字節(jié),其第一個(gè)字節(jié)從最高位開(kāi)始,連續(xù)的二進(jìn)制位值為1的個(gè)數(shù)決定了其編碼的位數(shù),其余各字節(jié)均以10開(kāi)頭。
//UTF-8最多可用到6個(gè)字節(jié)。 這里不考慮異常,因?yàn)間o的字符串基本都是標(biāo)準(zhǔn)utf8編碼
i += getPreNotZeroCount(sql[i]) - 1
continue;
}
*/
 //本字符類(lèi)型 預(yù)設(shè)為普通字符
 charType = NORMAL
 ch := sql[i]

 //下一個(gè)字符
 var chNext byte;
 chNext = getCharSafe(sql, rangeEnd, i + 1)

 //非有效sql內(nèi)容結(jié)束位置
 endPos := 0

 if ch == '-' && chNext == '-' {
 	//單行注釋
 	charType = LINE
 	//下標(biāo)移到非有效字符的最后
 	endPos = seekToNext(sql, i + 2, rangeEnd, charType)
 } else if ch == '/' && chNext == '*' {
 	//多行注釋
 	charType = MULTI
 	//下標(biāo)移到非有效字符的最后
 	endPos = seekToNext(sql, i + 2, rangeEnd, charType)
 } else if ch == '\'' {
 	//字符串
 	charType = STRING
 	//下標(biāo)移到非有效字符的最后
 	endPos = seekToNext(sql, i + 1, rangeEnd, charType)
 }

 //如果字符是非有效字符 則用空格代替 否則保持原樣
 if charType == NORMAL {
 	result = append(result, ch)
 } else {
 	result = append(result, chPad)
 	i = endPos - 1
 }
}

return result;
}

/**

獲取字符串或者注釋的右邊界位置(不包含)

rangeEnd是數(shù)組邊界
*/
func seekToNext(sql []byte, begPos int, rangeEnd int, charType int) int {

result := begPos;

switch charType {
case MULTI:
for ; result < rangeEnd; result++ {
ch := sql[result]
chNext := getCharSafe(sql, rangeEnd, result+ 1)
if ch == '*' && chNext == '/' {
 		result = result + 1;
 		break;
 	}
 }

 break
case LINE:
for ; result < rangeEnd; result++ {
ch := sql[result]
if ch == '\n' {
 		break;
 	}
 }

 break
case STRING:
for ; result < rangeEnd; result++ {
ch := sql[result]
chNext := getCharSafe(sql, rangeEnd, result + 1)
//sql字符串里面連續(xù)的單引號(hào)被認(rèn)為是' 則不是字符串結(jié)束標(biāo)志
 	if ch == '\'' && chNext == '\'' {
 		result = result + 1;
 		continue;
 	} else if ch == '\'' {
 		break;
 	}
 }

 break
default:
break;
}

result++;

return result;
}

完整代碼及單元測(cè)試已上傳 https://github.com/kingstarer/kingstarer.git

到此這篇關(guān)于使用go實(shí)現(xiàn)刪除sql里面的注釋和字符串功能的文章就介紹到這了,更多相關(guān)go刪除sql注釋和字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 聊聊Golang性能分析工具pprof的使用

    聊聊Golang性能分析工具pprof的使用

    對(duì)于線上穩(wěn)定運(yùn)行的服務(wù)來(lái)說(shuō),?可能會(huì)遇到?cpu、mem?利用率升高的問(wèn)題,那我們就需要使用?pprof?工具來(lái)進(jìn)行性能分析,所以本文就來(lái)和大家講講pprof的具體使用吧
    2023-05-05
  • Golang實(shí)現(xiàn)內(nèi)網(wǎng)穿透詳解

    Golang實(shí)現(xiàn)內(nèi)網(wǎng)穿透詳解

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)內(nèi)網(wǎng)穿透的相關(guān)知識(shí),包括原理和代碼實(shí)現(xiàn),文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-11-11
  • Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)

    Golang加權(quán)輪詢(xún)負(fù)載均衡的實(shí)現(xiàn)

    負(fù)載均衡器在向后端服務(wù)分發(fā)流量負(fù)載時(shí)可以使用幾種策略。本文主要介紹了Golang加權(quán)輪詢(xún)負(fù)載均衡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • go實(shí)現(xiàn)文件的創(chuàng)建、刪除與讀取示例代碼

    go實(shí)現(xiàn)文件的創(chuàng)建、刪除與讀取示例代碼

    這篇文章主要給大家介紹了關(guān)于go如何實(shí)現(xiàn)文件的創(chuàng)建、刪除與讀取的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2019-02-02
  • golang croncli 定時(shí)器命令詳解

    golang croncli 定時(shí)器命令詳解

    定時(shí)器是執(zhí)行任務(wù)時(shí)的常用功能,配置系統(tǒng)的定時(shí)任務(wù)太麻煩,所以就想用golang簡(jiǎn)單實(shí)現(xiàn)一個(gè)定時(shí)器命令,包括定時(shí)器命令格式、定時(shí)執(zhí)行命令的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • go string to int 字符串與整數(shù)型的互換方式

    go string to int 字符串與整數(shù)型的互換方式

    這篇文章主要介紹了go string to int 字符串與整數(shù)型的互換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • go語(yǔ)言編程實(shí)現(xiàn)遞歸函數(shù)示例詳解

    go語(yǔ)言編程實(shí)現(xiàn)遞歸函數(shù)示例詳解

    這篇文章主要為大家介紹了go語(yǔ)言編程實(shí)現(xiàn)遞歸函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Golang 高效排序數(shù)據(jù)詳情

    Golang 高效排序數(shù)據(jù)詳情

    本文我們介紹了怎么使用 Golang 語(yǔ)言標(biāo)準(zhǔn)庫(kù) sort 包排序數(shù)據(jù),需要注意的是,除了本文使用的類(lèi)型之外,其它任意類(lèi)型只要實(shí)現(xiàn) sort.Interface 的三個(gè)方法,都可以調(diào)用 sort.Sort() 函數(shù)排序數(shù)據(jù)。
    2021-11-11
  • 詳解Golang中的各種時(shí)間操作

    詳解Golang中的各種時(shí)間操作

    這篇文章主要介紹了詳解Golang中的各種時(shí)間操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • mayfly-go部署和使用詳解

    mayfly-go部署和使用詳解

    這篇文章主要介紹了mayfly-go部署和使用詳解,此處部署基于CentOS7.4部署,結(jié)合實(shí)例代碼圖文給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-09-09

最新評(píng)論

湟中县| 射洪县| 长白| 宁乡县| 浦县| 静海县| 潼南县| 龙岩市| 霍州市| 体育| 阿鲁科尔沁旗| 稷山县| 湖州市| 阿克| 双江| 宁都县| 安新县| 上杭县| 惠州市| 崇义县| 延边| 运城市| 洞口县| 明光市| 奉节县| 南涧| 贵阳市| 庄浪县| 桦甸市| 隆昌县| 松潘县| 洪雅县| 津南区| 镇原县| 阳朔县| 英德市| 久治县| 大兴区| 平武县| 台南县| 公主岭市|