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

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

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

項目里面有一個需求,要對sql進(jìn)行簡單的語法分析

為了避免sql里面的字符串和注釋對語法分析做干擾,我寫了一個java函數(shù),對sql進(jìn)行修剪,刪除里面字符串和注釋,用空格代替
周末閑著沒事,我用go重新實現(xiàn)了這個功能,感覺應(yīng)該會有后來人可以用上

說明:
sql里面的注釋有兩種單行注釋和多行注釋,其中單行注釋以--開頭,以\n結(jié)尾,多行注釋以/開頭,以/結(jié)尾
sql字符串是以'開頭,'結(jié)尾,但特別的地方是連續(xù)兩個單引號是代表一個單引號而不是字符串結(jié)束標(biāo)志

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

`
/**

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

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

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

 //下一個字符
 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ù)的單引號被認(rèn)為是' 則不是字符串結(jié)束標(biāo)志
 	if ch == '\'' && chNext == '\'' {
 		result = result + 1;
 		continue;
 	} else if ch == '\'' {
 		break;
 	}
 }

 break
default:
break;
}

result++;

return result;
}

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    golang croncli 定時器命令詳解

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

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

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

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

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

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

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

    詳解Golang中的各種時間操作

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

    mayfly-go部署和使用詳解

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

最新評論

新田县| 固始县| 都兰县| 玉林市| 克拉玛依市| 垦利县| 杂多县| 琼海市| 弋阳县| 临朐县| 金寨县| 玉林市| 明光市| 临西县| 嘉义县| 黔江区| 岢岚县| 千阳县| 定南县| 雅江县| 南安市| 仁怀市| 长汀县| 崇左市| 玉门市| 辉县市| 平武县| 新和县| 偏关县| 襄汾县| 双鸭山市| 噶尔县| 白山市| 黎川县| 惠州市| 库车县| 唐海县| 长治县| 青阳县| 青州市| 乡宁县|