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

仅按golang中的第一个元素拆分字符串,go,split,slice,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]
    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
}
有更简洁的方法吗?

n=2一起使用
将结果限制为两个子字符串

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

使用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
还有一种方法可以是:

branchArray := strings.Split(branchString, "/")
branchArray = []string{branchArray[0], strings.Join(branchArray[1:], "/")}

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

?根据您首先获取分支名称的方式,您可以从源代码中获取短名称。啊,我尝试过这个方法,但误解了N参数,尝试了0和1,现在我知道它不是索引边界,而是您希望返回多少结果!这很好用,谢谢!:)是的,我也很困惑,来自Python,其中
str.split()
采用可选的
maxslit
参数,指示要拆分的最大次数,而不是要返回的最大字符串数。您如何对方法性能进行基准测试?请给出一些信息是的,
SplitN
将执行一个额外的分配,在非简化版本中可能无论如何都需要,否则逻辑与
SplitN
相同,只是这不会验证
索引的返回~在OP用例的上下文中,100ns甚至不是网络调用周围的噪音。@AmitUpadhyay请阅读本文以了解有关如何基准测试的更多详细信息: