乐趣区

关于golang:Go118-新特性新增好用的-Cut-方法

大家好,我是煎鱼。

在各种写业务代码的时候,大家会经常要解决字符串的内容。常见的像是用邮箱登陆账号,如果是:eddycjy@gmail.com,那就得依据 @ 来切割,别离取出前和后,来辨认用户名和邮箱地址。

这种需要,在 Go 里写起来不便吗?明天就由煎鱼带大家理解。

背景

反复代码

独一无二,Ainar Garipov 在许多我的项目中遇到了后面咱们所提的切割需要。

例如:

idx = strings.Index(username, "@")
if idx != -1 {name = username[:idx]
} else {name = username}  

又或是:

idx = strings.LastIndex(address, "@")
if idx != -1 {host = address[idx+1:]
} else {host = address}

常常要重复写一些繁琐的代码,提案提出者示意不欢快。

新提案

施行内容

倡议新增 Cut 办法到 strings 规范库:

func Cut(s, sep string) (before, after string, found bool) {if i := Index(s, sep); i >= 0 {return s[:i], s[i+len(sep):], true
    }
    return s, "", false
}

同步也要在 bytes 规范库:

func Cut(s, sep []byte) (before, after []byte, found bool)

这样一来,就能够从本来的:

    eq := strings.IndexByte(rec, '=')
    if eq == -1 {return "","", s, ErrHeader}
    k, v = rec[:eq], rec[eq+1:]

变成:

    k, v, ok = strings.Cut(rec, "=")
    if !ok {return "","", s, ErrHeader}

写法上会更优雅,在简单的场景下会更具可读性和形象级别。

承受起因

可能就有小伙伴会吐槽了,Go 竟然只为了节俭 1 行代码,就搞了个新函数,这还是大道至简吗?

实际上,在官网团队(Russ Cox)染指后,他对 Go 主仓库进行了剖析,搜寻了相干相似函数的应用:

  • strings.Index。
  • strings.IndexByte。
  • strings.IndexRune。

统计后,转换为了能够应用 strings.Cut 的用法,在例子和测试数据之外有 311 个索引调用。

排除了一些的确不须要的,剩下 285 个调用。在这些调用中,有 221 次是最好写成 Cut 办法的,能更优雅。

也就是说,有现有的 Go 代码中,有 77% 能够用新增的 Cut 函数写得更分明,可读性和形象能够做得更好。

Go 主仓库的确存在如此反复的代码,他认为这也是十分不堪设想的!

总结

Go1.18 的新个性中,Cut 尽管只是新增了一个办法,看上去无伤大雅。

但相似 Cut 办法的用法,在 Go 的主版本中其实曾经被创造了两次。

该新办法的呈现,能够同时取代并简化四个不同的规范库函数:Index、IndexByte、IndexRune 和 SplitN 中的绝大部分用法。

因为这些起因,最终将 Cut 增加到规范库中。

你感觉怎么样?:)

若有任何疑难欢送评论区反馈和交换,最好的关系是相互成就 ,各位的 点赞 就是煎鱼创作的最大能源,感激反对。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。

参考

  • bytes, strings: add Cut
退出移动版