为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕运维8079593 2022-05-23 16:08:32
我正在尝试解析 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 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

对于 Go >= 1.18,请参阅此答案。


对于 Go < 1.18:


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


func ParseBranchname(branchString string) (remote, branchname string) {

    branchArray := strings.SplitN(branchString, "/", 2)

    remote = branchArray[0]

    branchname = branchArray[1]

    return

}


查看完整回答
反对 回复 2022-05-23
?
潇湘沐

TA贡献1816条经验 获得超6个赞

去 1.18

使用strings.Cut:


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


func ParseBranchname(branchString string) (remote, branchname string) {

    remote, branchname, _ = strings.Cut(branchString, "/")

    return

}

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


正如 Go 1.18 发行说明中所述,Cut “可以替换和简化 、 、 和 的Index许多IndexByte常见IndexRune用法SplitN”。特别是,SplitN与n=2。


Playground——最初由@mkopriva 在评论中发布——修改为包含一个示例Cut:https ://go.dev/play/p/bjBhnr3Hg5O


查看完整回答
反对 回复 2022-05-23
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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


查看完整回答
反对 回复 2022-05-23
  • 3 回答
  • 0 关注
  • 302 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信