您现在的位置是:亿华云 > IT科技
Go1.18 新特性:新增好用的 Cut 方法
亿华云2025-10-09 03:36:54【IT科技】1人已围观
简介大家好,我是煎鱼。在各种写业务代码的时候,大家会常常要处理字符串的内容。常见的像是用邮箱登陆账号,如果是:eddycjy@gmail.com,那就得根据 @ 来切割,分别取出前和
大家好,新特性新我是增好煎鱼。
在各种写业务代码的方法时候,大家会常常要处理字符串的新特性新内容。常见的增好像是用邮箱登陆账号,如果是方法: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 添加到标准库中。
你觉得怎么样?:)
参考
bytes, strings: add Cut
b2b供应网很赞哦!(62)
相关文章
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 使用 LGBM 等模型预测信用卡潜在客户
- 再有人问你什么是分库分表,直接把这篇文章发给他
- 高并发场景下,如何保证生产者投递到消息中间件的消息不丢失?
- 6、提示添加成功,点击确认进行最后的确定操作。一般10分钟就解析生效,可以用域名进行访问了。
- 一篇了解集中式数据库的集群计算
- 对于域名选择我们要了解哪些呢?为什么要域名?
- 六个意想不到的 JavaScript 问题
- 付款完成后,您只需耐心等待,如果您注册成功,系统会提示您。这里需要注意的是,域名是一个即时产品,只有在最终付款成功时才能预订,注册成功后不能更改。
- 魔术方法