【问题标题】:Split a string only by the first element in golang仅按 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
}

有没有更简洁的方法来做到这一点?

【问题讨论】:

标签: go split slice


【解决方案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 = []string{branchArray[0], strings.Join(branchArray[1:], "/")}

remote = branchArray[0]
branchname = branchArray[1]

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 2015-08-18
    • 2012-05-21
    • 1970-01-01
    • 2015-07-25
    • 2017-12-15
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多