有没有更规范的方法来操作Go中的URL路径?
我正在Go中开发一个充当中间件的系统。对于我想要解析和分析的其他服务中的一些URL,我们在路径的开头嵌入了一些变量 例如,假设对于用户有没有更规范的方法来操作Go中的URL路径?,go,Go,我正在Go中开发一个充当中间件的系统。对于我想要解析和分析的其他服务中的一些URL,我们在路径的开头嵌入了一些变量 例如,假设对于用户amysmith我们可能有路径/amysmith/edit/profile来编辑amysmith的用户配置文件 出于本系统的目的,我希望将路径交换为/edit/profile,就像路径的第一部分不存在一样。诚然,这并不理想,但改变总体命名是下一次更大的项目 这可以通过使用字符串来实现。连接,然后在/前面加上前缀并删除最后一个字符。我之所以这样做,是因为它使路径格式
amysmith
我们可能有路径/amysmith/edit/profile
来编辑amysmith
的用户配置文件
出于本系统的目的,我希望将路径交换为/edit/profile
,就像路径的第一部分不存在一样。诚然,这并不理想,但改变总体命名是下一次更大的项目
这可以通过使用字符串来实现。连接,然后在/
前面加上前缀并删除最后一个字符。我之所以这样做,是因为它使路径格式与其他未被操纵的路径保持一致,这些路径总是以/
开头
func (r Resource) CleanedPath() string {
parts := strings.Split(r.URL.Path, "/")
return strings.TrimRight("/" + strings.Join(parts[2:], "/"), "/")
}
func cleanPath(p string) string {
if i := strings.IndexByte(p[len("/"):], '/'); i >= 0 {
return p[i+len("/"):]
}
return p
}
那种方法让我觉得有点笨拙。有没有更好的“去”的方法呢?在第二个/
之前把所有的东西都切掉
func (r Resource) CleanedPath() string {
parts := strings.Split(r.URL.Path, "/")
return strings.TrimRight("/" + strings.Join(parts[2:], "/"), "/")
}
func cleanPath(p string) string {
if i := strings.IndexByte(p[len("/"):], '/'); i >= 0 {
return p[i+len("/"):]
}
return p
}
这种方法避免了内存分配。以下是一种不使用包的方法:
package main
func split(path string, count int) string {
for n, r := range path {
if r == '/' { count-- }
if count == 0 {
return path[n:]
}
}
return ""
}
func main() {
{ // example 1
s := split("/amysmith/edit/profile", 2)
println(s == "/edit/profile")
}
{ // example 2
s := split("/amysmith/edit/profile", 3)
println(s == "/profile")
}
}
那肯定没那么笨重。为什么你认为围棋更熟悉?我正在努力提高我对语言惯例的熟悉程度。@josephkibe这个答案避免了内存分配。我会使用gorilla/mux并将/{name}/edit/profile
重定向到/edit/profile
。无需任何操作。您可以使用filepath.Join
而不是strings.Join
。它做同样的事情,但更“规范”,并确保您不会以重复的/
字符结束,比如说,将/foo/
与/bar/
连接在一起,而不涉及太多细节,因此我得出结论,在不中断其他事情的情况下,执行此路径操纵是我现在需要的权宜之计。如果我是从头开始,我完全同意不需要这样做会更好。@Flimzy path.Join比filepath.Join更合适,因为这是一个URL。strings.Join比path.Join更合适,因为OP正在反转strings.Split的操作。