Go语言MUX路由正则表达式使用报错,求正确实现方式
解决Go语言MUX路由中正则字符串的转义问题
我太懂你踩的这个转义坑了!在Go里处理带特殊字符的路由正则时,双引号和单引号的规则很容易让人懵,咱们一步步把问题捋清楚解决掉:
为什么会报错?
- 双引号字符串:Go会解析双引号里的反斜杠
\作为转义字符,但\-和\/并不是Go认可的标准转义序列(Go只认\n、\t这类),所以直接写就会抛出unknown escape sequence错误。 - 单引号包裹:单引号在Go里是用来定义单个字符(rune类型)的,不是字符串类型,你用单引号包整个路由字符串,Go会把它当成单个rune字面量,自然会报类型不匹配,同时转义问题也依然存在。
两种正确的解决方案
方案1:用反引号包裹原始字符串(最推荐)
反引号里的字符串是原始字符串字面量,Go不会解析任何转义字符,完全保留你写的内容,这是最省心不容易出错的方式:
package main import ( "net/http" "github.com/gorilla/mux" ) func yourHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) w.Write([]byte("Foo: " + vars["foo"] + "\nBar: " + vars["bar"] + "\nVzz: " + vars["vzz"])) } func main() { r := mux.NewRouter() // 直接用反引号包裹整个路由规则即可 r.HandleFunc(`/{foo}/{bar:[a-zA-Z0-9=\-/]+}.{vzz}`, yourHandler) http.Handle("/", r) http.ListenAndServe(":8080", nil) }
方案2:双引号中转义反斜杠
如果你一定要用双引号,需要把每个反斜杠\转成\\(因为双引号里\\才表示一个实际的\):
r.HandleFunc("/{foo}/{bar:[a-zA-Z0-9=\\-\\/]+}.{vzz}", yourHandler)
这里\-变成\\-,\/变成\\/,Go解析后会把\\替换成单个\,传递给MUX的正则就是正确的格式。
额外小提示
在正则字符集[]里,-如果放在开头或结尾其实不需要转义,比如你可以把规则改成[a-zA-Z0-9=\/-]+,这样在原始字符串里连\-的转义都可以省略,不过转义了也不会有问题,看你个人习惯就行。
内容的提问来源于stack exchange,提问作者Евгений Шахов
相关产品推荐
相关产品推荐

