我正在尝试使用Replacer
从字符串中替换多个不同的字符,但是在替换一个字符串时遇到问题。输出有两个下划线而不是一个,如果我尝试使用其他Replacer
替换,那么它不能完全替换它。
尝试Go Playground上的代码:
package main
import (
"fmt"
"strings"
)
//Expecting output to be emp_my_stats
func main() {
var input string = "/v1.0/emp/emp_1/my_stats"
replacer := strings.NewReplacer("/v1.0/", "", "/", "_", "emp_1", "")
// replacer := strings.NewReplacer("/v1.0/", "", "/", "_", "/emp_1", "")
output := replacer.Replace(input)
fmt.Printf("output %v", output)
}
我可以使用多个Replacer
等但是真的想在一次通过/或一次声明中这样做。
有什么建议干净利落的吗?我的目标是提高效率(这将经常进行,尽管这些字符串很短很重要),也不使用多个Replacer
。
答案 0 :(得分:5)
您还没有指定任何其他可能的输入,但它看起来是这样的:
input := "/v1.0/emp/emp_1/my_stats"
您需要使用下划线"emp"
连接的"my_stats"
和'_'
部分。根据您对替换者的尝试判断,"/v1.0/"
和"/emp_1/"
部分是静态的,因此您可以使用一个替换器执行此操作:
replacer := strings.NewReplacer("/v1.0/", "", "/emp_1/", "_")
完整示例:
input := "/v1.0/emp/emp_1/my_stats"
replacer := strings.NewReplacer("/v1.0/", "", "/emp_1/", "_")
output := replacer.Replace(input)
fmt.Println("Output:", output)
输出(在Go Playground上尝试):
Output: emp_my_stats
备注:强>
你提到你必须经常这样做,你希望这是有效的。因此,请确保只创建一个Replacer
,并在需要进行替换时重复使用它(例如,您可以将其存储在初始化一次的全局变量中)。根据您的输入判断,它看起来像是某个URL的路径,并且您最希望这样做的是HTTP处理程序,它可以在多个goroutine上并发运行。使用来自多个goroutines的Replacer
是安全的,引用Replacer
的文档:
多个goroutine可以安全地同时使用。
备注#2:
如果输入中的"/v1.0/"
和"/emp_1/"
部分不是静态的,您无法使用Replacer
真正解决问题。在这种情况下,您可以使用正则表达式或作为更有效的解决方案,将字符串拆分为'/'
并使用'_'
加入相关部分。
答案 1 :(得分:2)
strings.Split可能会达到你想要的效果:
package main
import (
"fmt"
"strings"
)
//Expecting output to be emp_my_stats
func main() {
input := "/v1.0/emp/emp_1/my_stats"
xs := strings.Split(input, "/")
fmt.Println(xs)
fmt.Println(xs[4])
fmt.Println(xs[3] + xs[4])
fmt.Println(xs[3][:4] + xs[4])
fmt.Println(xs[3][:len(xs[3])-1] + xs[4])
}
以上产生了这个输出:
[ v1.0 emp emp_1 my_stats]
my_stats
emp_1my_stats
emp_my_stats
emp_my_stats
您可以在此处查看go playground.