Go 如何解析/id/123 not格式的URL?foo=bar
我正在尝试解析一个URL,如: 我已经阅读了Go 如何解析/id/123 not格式的URL?foo=bar,go,Go,我正在尝试解析一个URL,如: 我已经阅读了net/url文档,但它似乎只解析如下字符串 在第一个示例中,我如何解析ID,从而得到ID的值 这不是我自己的路由,而是从openid请求返回的http字符串。您可以尝试使用正则表达式,如下所示: import "regexp" re, _ := regexp.Compile("/id/(.*)") values := re.FindStringSubmatch(path) if len(values) > 0 { fmt.Prin
net/url
文档,但它似乎只解析如下字符串
在第一个示例中,我如何解析ID,从而得到ID的值
这不是我自己的路由,而是从openid请求返回的http字符串。您可以尝试使用正则表达式,如下所示:
import "regexp"
re, _ := regexp.Compile("/id/(.*)")
values := re.FindStringSubmatch(path)
if len(values) > 0 {
fmt.Println("ID : ", values[1])
}
在您的示例中/id/123是一个路径,您可以通过使用path模块中的Base来获取“123”部分
package main
import (
"fmt"
"path"
)
func main() {
fmt.Println(path.Base("/id/123"))
}
为便于参考,以下是path模块上的文档 这里有一个简单的解决方案,适用于与您的URL结构相同的URL(您可以改进以适应其他结构的URL)
如果您事先知道要获取的URL的结构,使用这种方法比正则表达式更快。您看过gorilla/mux吗?-很容易处理路由参数。更新了我的问题。对不起,我检查了那个包,但它似乎只解析了我文章的第二个示例中的字符串查询,而不是第一个,你能给我一个示例吗?我一定在做什么wrong@Datsik答案已编辑!另外,请查看@gollipher的答案。您可以将
path
包与url.Parse(path).path一起使用,而不是在此处编写getFirstParam
函数。不确定为什么会被否决,虽然regexp的运行速度并不快,但这是一个完全有效的答案。这很有用,也很相关,但仅供参考,它还将匹配/id/123/456返回的456,这不是我所期望的。
package main
import (
"fmt"
"net/url"
)
var path = "http://localhost:8080/id/123"
func getFirstParam(path string) (ps string) {
// ignore first '/' and when it hits the second '/'
// get whatever is after it as a parameter
for i := 1; i < len(path); i++ {
if path[i] == '/' {
ps = path[i+1:]
}
}
return
}
func main() {
u, _ := url.Parse(path)
fmt.Println(u.Path) // -> "/id/123"
fmt.Println(getFirstParam(u.Path)) // -> "123"
}
import "path"
func main() {
u, _ := url.Parse(path)
ps := path.Base(u.Path)
}