您好,登錄后才能下訂單哦!
利用go語言怎么刪除sql語句中的注釋與字符串?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
關鍵函數如下:
` /** 將字節數組里面注釋和字符串,用空格替換 rangeBeg和rangeEnd是數組元素起始位置 左閉右開 */ func TrimSqlByteArray(sql []byte, rangeBeg int, rangeEnd int) []byte { sqlLength := rangeEnd - rangeBeg - 1; //刪除注釋或者字符串后 用空格填充 必免因刪除導致粘連改變sql語義 const chPad = ' ' //結果切片,預分配空間為入參sql長度一半 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是一種變長字節編碼方式。對于某一個字符的UTF-8編碼,如果只有一個字節則其最高二進制位為0; //如果是多字節,其第一個字節從最高位開始,連續的二進制位值為1的個數決定了其編碼的位數,其余各字節均以10開頭。 //UTF-8最多可用到6個字節。 這里不考慮異常,因為go的字符串基本都是標準utf8編碼 i += getPreNotZeroCount(sql[i]) - 1 continue; } */
//本字符類型 預設為普通字符 charType = NORMAL ch := sql[i] //下一個字符 var chNext byte; chNext = getCharSafe(sql, rangeEnd, i + 1) //非有效sql內容結束位置 endPos := 0 if ch == '-' && chNext == '-' { //單行注釋 charType = LINE //下標移到非有效字符的最后 endPos = seekToNext(sql, i + 2, rangeEnd, charType) } else if ch == '/' && chNext == '*' { //多行注釋 charType = MULTI //下標移到非有效字符的最后 endPos = seekToNext(sql, i + 2, rangeEnd, charType) } else if ch == '\'' { //字符串 charType = STRING //下標移到非有效字符的最后 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是數組邊界 */ 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字符串里面連續的單引號被認為是' 則不是字符串結束標志 if ch == '\'' && chNext == '\'' { result = result + 1; continue; } else if ch == '\'' { break; } } break
default: break; } result++; return result; }
看完上述內容,你們掌握利用go語言怎么刪除sql語句中的注釋與字符串的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。