Разбить строку только по первому элементу в golang - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь проанализировать git имена ветвей и разделить их, чтобы я мог разделить пульт и имя ветви

Ранее я просто разделял по первой sla sh:

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

Но я забыл, что некоторые люди используют косые черты и в git именах ветвей, даже в нескольких!

Прямо сейчас я беру первый элемент в срезе из разделения, затем перемещаю каждый элемент одна сделана и сливается обратно в sla sh:

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 ]

4 голосов
/ 20 марта 2020

Используйте strings.SplitN с n=2, чтобы ограничить результат двумя подстроками.

func ParseBranchname(branchString string) (remote, branchname string) {
    branchArray := strings.SplitN(branchString, "/", 2)
    remote = branchArray[0]
    branchname = branchArray[1]
    return
}
1 голос
/ 20 марта 2020

Еще один способ может быть:

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

remote = branchArray[0]
branchname = branchArray[1]
1 голос
/ 20 марта 2020

Используйте 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
...