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

Pet*_*ter 3 split go slice

我正在尝试解析 git 分支名称并拆分它们,以便我可以将远程名称和分支名称分开

以前我只是在第一个斜杠上拆分:

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

但我忘记了有些人也在 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
}
Run Code Online (Sandbox Code Playgroud)

有没有更干净的方法来做到这一点?

Jon*_*art 12

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

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


bla*_*een 8

去1.18

\n

使用strings.Cut

\n
\n

[此函数]s 围绕 的第一个实例sep进行切片,返回 之前和之后的文本sep。结果found报告是否sep出现在s. 如果sep没有出现s,则切回s, "", false

\n
\n
func ParseBranchname(branchString string) (remote, branchname string) {\n    remote, branchname, _ = strings.Cut(branchString, "/")\n    return\n}\n
Run Code Online (Sandbox Code Playgroud)\n

(请注意,此代码片段忽略第三个返回值,一个布尔值,它告诉是否在输入字符串中找到了分隔符。)

\n

正如 Go 1.18 发行说明中提到的,Cut “可以替换和简化Index, IndexByte, IndexRune, 和的许多常见用法SplitN。特别是,SplitNn=2.

\n

Playground \xe2\x80\x94 最初由 @mkopriva 在评论\xe2\x80\x94中发布,修改后包含一个示例Cuthttps ://go.dev/play/p/bjBhnr3Hg5O

\n