仅按 golang 中的第一个元素拆分字符串
Posted
技术标签:
【中文标题】仅按 golang 中的第一个元素拆分字符串【英文标题】:Split a string only by the first element in golang 【发布时间】:2020-07-01 14:36:30 【问题描述】:我正在尝试解析 git 分支名称并将它们拆分,以便我可以将远程和分支名称分开
之前我只是在第一个斜线处拆分:
func ParseBranchname(branchString string) (remote, branchname string)
branchArray := strings.Split(branchString, "/")
remote = branchArray[0]
branchname = branchArray[1]
return
但我忘记了有些人也在 git 分支名称中使用斜杠,甚至多个!
现在我从分割中取出切片中的第一个元素,然后移动每个元素并在斜杠上合并:
func ParseBranchname(branchString string) (remote, branchname string)
branchArray := strings.Split(branchString, "/")
remote = branchArray[0]
copy(branchArray[0:], branchArray[0+1:])
branchArray[len(branchArray)-1] = ""
branchArray = branchArray[:len(branchArray)-1]
branchname = strings.Join(branchArray, "/")
return
有没有更简洁的方法来做到这一点?
【问题讨论】:
strings.SplitN
?
根据您首先获取分支名称的方式,您可以只从源中获取短名称。
play.golang.org/p/-rxRjStvQki
【参考方案1】:
使用strings.SplitN
和n=2
将结果限制为两个子字符串。
func ParseBranchname(branchString string) (remote, branchname string)
branchArray := strings.SplitN(branchString, "/", 2)
remote = branchArray[0]
branchname = branchArray[1]
return
【讨论】:
啊,我试过这个但是误解了N参数并尝试了0和1,现在我明白了它不是索引绑定,它是你想要返回多少个结果!这工作得很好,谢谢! :) 是的,我也很困惑,来自 Python,其中str. split()
接受一个可选的 maxsplit
参数,表示 split 的最大次数,而不是最大次数要返回的字符串。【参考方案2】:
使用 strings.Index 查找第一个 / 的索引,然后使用该信息手动拆分:
func ParseBranchnameNew(branchString string) (remote, branchName string)
firstSlash := strings.Index(branchString, "/")
remote = branchString[:firstSlash]
branchName = branchString[firstSlash+1:]
return
与您的原始代码比较:
goos: linux
goarch: amd64
BenchmarkParseBranchname-12 10000000 131 ns/op
BenchmarkParseBranchnameNew-12 300000000 5.56 ns/op
PASS
【讨论】:
您如何对方法性能进行基准测试?请提供一些信息 是的,SplitN
会做一个额外的分配,这在非简化版本中可能无论如何都需要,否则逻辑与SplitN
相同,除了这不验证返回Index
。在 OP 用例的上下文中,大约 100ns 甚至不是网络调用周围的噪音。
@AmitUpadhyay 请阅读此内容以了解有关如何进行基准测试的更多详细信息:dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go【参考方案3】:
另一种方法可能是:
branchArray := strings.Split(branchString, "/")
branchArray = []stringbranchArray[0], strings.Join(branchArray[1:], "/")
remote = branchArray[0]
branchname = branchArray[1]
【讨论】:
以上是关于仅按 golang 中的第一个元素拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchedResultsController 仅按第一个排序描述符排序
jquery拆分数组,块的最后一个元素是下一个块的第一个元素