有没有更规范的方法来操作Go中的URL路径?

有没有更规范的方法来操作Go中的URL路径?,go,Go,我正在Go中开发一个充当中间件的系统。对于我想要解析和分析的其他服务中的一些URL,我们在路径的开头嵌入了一些变量 例如,假设对于用户amysmith我们可能有路径/amysmith/edit/profile来编辑amysmith的用户配置文件 出于本系统的目的,我希望将路径交换为/edit/profile,就像路径的第一部分不存在一样。诚然,这并不理想,但改变总体命名是下一次更大的项目 这可以通过使用字符串来实现。连接,然后在/前面加上前缀并删除最后一个字符。我之所以这样做,是因为它使路径格式

我正在Go中开发一个充当中间件的系统。对于我想要解析和分析的其他服务中的一些URL,我们在路径的开头嵌入了一些变量

例如,假设对于用户
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的操作。