大家好,我是煎鱼。
在各种写业务代码的时候,大家会经常要解决字符串的内容。常见的像是用邮箱登陆账号,如果是: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