Go中如何正确处理带有转义的字符串?

go中如何正确处理带有转义的字符串?

问题内容

我正在创建一个程序,该程序正在处理和计算开源存储库和库的大小,并将数据保存到数据库中以供进一步分析。

  • 我有一个输入字符串:github.com/azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1
  • 解析为格式:github.com/!azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1
  • 然后我将其解析为 /home/username/dev/glass/tmp/pkg/mod/github.com/!azure/[email protected] 格式,这是我的文件系统中的有效路径,我在其中已下载该特定的 go 库。
  • 之后,我将该路径传递给 gocloc -程序 (https://github.com/hhatto/gocloc)
  • 并解析结果。

但问题是,当我将字符串 /home/username/dev/glass/tmp/pkg/mod/github.com/!azure/[email protected] 保存到变量中时,go 实际上添加了对我保存的字符串的另一个转义,因此它实际上是内存中的 /home/username/dev/glass/tmp/pkg/mod/github.com/\!azure/[email protected] 。 (fmt.println - 例如删除它)

问题是,当我将该字符串作为参数传递给 os/exec(运行 gocloc 和该路径字符串)时,它运行带有两个转义符的命令 - 这不是有效的路径。

有什么办法可以解决这个问题吗?对我来说,一个想法是只创建一个关于我想做的事情的 shell 脚本

此函数将 github.com/azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 解析为 github.com/!azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a 格式1 - 及之后这被保存到一个变量中,并且该变量比它应该有的多了一次转义。

func parseurltovendordownloadformat(input string) string { // split the input string on the first space character parts := strings.splitn(input, " ", 2) if len(parts) != 2 { return "" } // split the package name on the '/' character packagenameparts := strings.split(parts[0], "/") // add the '!' prefix and lowercase each part of the package name for i, part := range packagenameparts { if hasuppercase(part) { packagenameparts[i] = "\!" + strings.tolower(part) } } // join the modified package name parts with '/' characters packagename := strings.join(packagenameparts, "/") return strings.replaceall(packagename+"@"+parts[1], `\!`, `!`) }登录后复制