Golang实现验证字符串是否为有效的URL

前言

在实际开发过程中,有时候会遇到 URL 的校验问题,其实我也是直接调用了第三方库,但是也引发了一个思考,Go 语言中有哪些方法去验证一个字符串是否满足 URL 格式呢?

https://golang.org

下面你可以看到一个 URL 的结构,它符合 URI 的结构

URI = scheme:[//authority]path[?query][#fragment]
authority = [userinfo@]host[:port]

官方 URL 包

在 Golang 中利用 url.ParseRequestURI 可以简单验证我们的 URL。

ParseRequestURI 将 rawurl 解析成 URL 结构。它假定在HTTP请求中接收到 rawurl,因此 rawurl 仅被解释为绝对 URI 或绝对路径。假定字符串 rawurl 没有 #fragment 后缀。(Web 浏览器在将 URL 发送到 Web 服务器之前去除 #fragment。)

ParseRequestURI 与 Parse

还有另一种方法应该用于解析 URL 字符串,但有一些注意事项。它允许相对 URL 使验证更加宽松。它是url.Parse

如文档中所述:

Parse 将 rawurl 解析成 URL 结构。
rawurl 可以是相对的(路径,没有主机)或绝对的(以方案开头)。尝试在没有方案的情况下解析主机名和路径是无效的,但由于解析歧义,不一定会返回错误。

比如如下的例子:

使用 ParseRequestURI

在 Google 解决方法的时候,根据这篇教程中 How to check if a string is a valid URL in Golang? 提供的方法,写了一个函数:

https

运行结果如图:

使用 url-verifier 包

go get -u github.com/davidmytton/url-verifier

运行结果:

verifier.gogovalidator
govalidator

使用 govalidator 包

govalidator

GitHub 地址:github.com/asaskevich/govalidator , 目前收获了 5.7k 的 star

go get github.com/asaskevich/govalidator

运行结果如下:

正则表达式匹配

govalidator
main.go

运行结果:

除了校验 URL,这个包还提供了众多的字符串校验方法,例如校验邮箱、信用卡格式、IP...

总结

数据校验是每个程序员日常开发过程的一部分,尤其是在从事后端服务时,数据验证必须严格,保持正确。

在这篇文章中,我们讨论了如何在 Go 语言中正确验证一个字符串是否是 URL,当然利用了官方包和优秀的第三方包,在实际过程中,可能我们为了简便会直接使用别人开发好的工具,但是在学习过程中,不妨也去思考别人实现的原理,结合实际业务需要,进而扩展成自己的工具包。