成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go1.18 新特性:新增好用的 Cut 方法

開發 前端
在各種寫業務代碼的時候,大家會常常要處理字符串的內容。常見的像是用郵箱登陸賬號,如果是: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


責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2022-02-11 21:01:18

GoNetip網絡庫

2022-01-19 08:51:00

Module工作區Go

2022-02-14 09:32:49

Go場景TryLock

2021-12-02 18:21:49

GoIP 包設計

2021-12-27 18:27:18

GoTryLockJava

2022-02-16 08:59:43

Go方法Title

2022-01-26 00:02:01

Go二進制元信息

2021-12-28 07:20:44

泛型Go場景

2021-12-15 12:59:56

Go泛型版Beta1

2021-12-15 10:23:56

Go 1.18 Bet語言泛型

2022-05-17 08:02:55

GoTryLock模式

2022-03-18 18:00:00

編程語言泛型支持模糊測試

2021-10-18 10:53:26

Go 代碼技術

2021-10-08 15:55:52

Python模塊開發

2022-01-10 11:33:17

Go測試軟件

2022-09-13 09:46:44

Go開發者調查Go 1.18

2021-10-29 10:55:07

Go 泛型語言

2021-12-03 18:29:31

GoAny 泛型

2021-09-05 18:25:30

Go命令倉庫

2023-01-28 08:05:32

轉換Go泛型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色眯眯视频在线观看 | 一级黄色片在线免费观看 | 欧美日一区二区 | 国产精品久久精品 | 久久精品免费 | 日韩av在线一区二区 | 欧美三级在线 | 日韩欧美精品 | 国产黄色大片在线免费观看 | 成人欧美一区二区三区在线播放 | 日韩在线视频播放 | 国产精品久久欧美久久一区 | 久久久久一区二区三区四区 | 中文字幕av网站 | 亚洲成人一二三 | 一本色道精品久久一区二区三区 | 国产精品一区二区视频 | 国产精品久久久久久二区 | 自拍 亚洲 欧美 老师 丝袜 | 欧美日韩高清 | 91亚洲一区 | 精品视频一区二区三区在线观看 | h片在线观看网站 | 亚洲欧美日韩国产综合 | 成人国产精品久久 | 国产最新网址 | 99精品国自产在线观看 | 一级毛片观看 | 欧美久久久久久久久中文字幕 | 亚洲欧洲日本国产 | 五月婷婷婷 | 福利网站导航 | 国产成人91视频 | 国产精品久久久久久久久久久免费看 | 免费看的黄网站 | 日韩不卡一二区 | 国产ts一区| 一级欧美一级日韩片免费观看 | 免费在线观看黄视频 | 日韩欧美亚洲 | 国产精品毛片无码 |