仅按golang中的第一个元素拆分字符串

时间:2020-03-20 12:47:12

标签: go split slice

我正在尝试解析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
}

是否有一种更清洁的方法?

3 个答案:

答案 0 :(得分:7)

使用strings.SplitNn=2将结果限制为两个子字符串。

func ParseBranchname(branchString string) (remote, branchname string) {
    branchArray := strings.SplitN(branchString, "/", 2)
    remote = branchArray[0]
    branchname = branchArray[1]
    return
}

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

另一种方法可能是:

{{1}}
相关问题