Go语言转换原始字节串为UUID时触发invalid syntax报错如何解决
问题根因
strconv.Unquote仅支持解析符合Go语言字面量规范的字符串,双引号包裹的字符串中,\'属于非法转义序列——Go语法规定单引号在双引号字符串中不需要转义,直接写'即可,只有单引号包裹的rune字面量才支持\'转义。
案例2的输入串中包含\'片段,因此触发invalid syntax报错;案例1中仅包含合法的\"转义,因此可以正常解析。
修复方案
不要使用strconv.Unquote处理这类包含非标准转义的八进制字节串,自行实现转义解析逻辑,直接提取每个转义片段对应的字节值,凑齐16字节后即可传入uuid.FromBytes生成标准UUID。
可用实现代码如下:
package main import ( "fmt" "strconv" "strings" "github.com/google/uuid" ) // parseOctalByteString 解析带\ddd八进制转义的原始字节串,自动兼容\'这类非标准转义 func parseOctalByteString(raw string) ([]byte, error) { // 移除首尾包裹的双引号 raw = strings.TrimPrefix(raw, `"`) raw = strings.TrimSuffix(raw, `"`) var buf []byte for i := 0; i < len(raw); i++ { // 识别三位八进制转义序列\ddd if raw[i] == '\\' && i+3 < len(raw) { v, err := strconv.ParseUint(raw[i+1:i+4], 8, 8) if err == nil { buf = append(buf, byte(v)) i += 3 continue } } // 普通字符直接追加,跳过非标准转义的反斜杠 if raw[i] != '\\' { buf = append(buf, raw[i]) } } return buf, nil } func main() { rawStr := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"` b, err := parseOctalByteString(rawStr) if err != nil { panic(err) } // 可选:校验字节长度必须为16,避免非法输入 if len(b) != 16 { panic("invalid byte length for UUID") } u, err := uuid.FromBytes(b) if err != nil { panic(err) } fmt.Println(u.String()) }
运行上述代码输出:
9dbb2711-03b1-4012-96bd-6fb5d20289b3
- 该实现同时兼容给出的两类输入格式,会自动处理
\'这类不符合Go字符串规范的转义片段。 - 增加16字节长度校验可以提前拦截非法输入,避免后续UUID解析逻辑抛出非预期错误。
内容的提问来源于stack exchange,提问作者Abhay Gupta
相关产品推荐
相关产品推荐

