仅按 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.SplitNn=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 中的第一个元素拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

拆分字符串中的第一个逗号

golang 387字符串中的第一个唯一字符

NSFetchedResultsController 仅按第一个排序描述符排序

jquery拆分数组,块的最后一个元素是下一个块的第一个元素

拆分字符串中的第一个空格和最后一个空格并将输出的大小限制为3

Java拆分功能消除空间