自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 提案:增加泛型版 Slices 和 Maps 新包

開發(fā) 后端
今天要討論的泛型版功能支持也是如此,分別包含:map(#47330)、slice(#45955)、container/set(#47331) 三種通用類型的支持。

 [[416200]]

本文轉載自微信公眾號「腦子進煎魚了」,作者陳煎魚。轉載本文請聯(lián)系腦子進煎魚了公眾號。

大家好,我是煎魚。

現(xiàn)在是 2021 年 8 月份了,根據(jù) Go 語言發(fā)布周期的 2,8 原則。Go 1.17 即將發(fā)布,在寫這篇文章時,現(xiàn)在已經(jīng)進行到了 rc2:

這意味著離 Go1.18 釋出泛型的正式支持又近了一點點,社區(qū)中討論泛型相關的周邊功能的聲音又多了起來。

今天要討論的泛型版功能支持也是如此,分別包含:map(#47330)、slice(#45955)、container/set(#47331) 三種通用類型的支持。

我們主要展開 maps 和 slices,其余的都大同小異,理解核心思想就好。

maps

該提案建議定義一個新的包 maps,它將提供可用于任何類型的 map 的函數(shù):

下面的描述側重于描述 API 的提供:

  1. package maps 
  2.  
  3. func Keys[K comparable, V any](m map[K]V) []K 
  4.  
  5. func Values[K comparable, V any](m map[K]V) []V 
  6.  
  7. func Equal[K, V comparable](m1, m2 map[K]V) bool 
  8.  
  9. func EqualFunc[K comparable, V1, V2 any](m1 map[K]V1, m2 map[K]V2, cmp func(V1, V2) bool) bool 
  10.  
  11. func Clear[K comparable, V any](m map[K]V) 
  12.  
  13. func Clone[K comparable, V any](m map[K]V) map[K]V 
  14.  
  15. func Add[K comparable, V any](dst, src map[K]V) 
  16.  
  17. func Filter[K comparable, V any](m map[K]V, keep func(K, V) bool) 
  • Keys:返回 map 的鍵值。這些鍵將是一個不確定的順序。
  • Values:返回 map 值。這些值將以不確定的順序出現(xiàn)。
  • Equal:匹配兩個 map 是否包含相同的鍵/值對。
  • EqualFunc:EqualFunc 與 Equal 類似,但使用 cmp 進行數(shù)值比較。
  • Clear:從 map 中清除所有條目,使其為空。
  • Clone:返回一個 map 的副本,這是一個淺層克隆。新的鍵和值使用普通的賦值來設置。
  • Add:將 src 中的所有鍵/值對添加到 dst 中。當 src 中的一個鍵已經(jīng)存在于 dst 中時,dst 中的值將被 src 中的鍵相關的值覆蓋。
  • Filter:過濾器從 map 中刪除任何 keep 返回結果為 false 的鍵/值對。

slice

該提案建議定義一個新的包 slices,它將提供可用于任何類型的 slice 的函數(shù):

下面的描述側重于描述 API 的提供:

  1. package slices 
  2.  
  3. import "constraint" 
  4.  
  5. func Equal[T comparable](s1, s2 []T) bool 
  6.  
  7. func EqualFunc[T1, T2 any](s1 []T1, s2 []T2, eq func(T1, T2) bool) bool 
  8.  
  9. func Compare[T constraints.Ordered](s1, s2 []T) int 
  10.  
  11. func CompareFunc[T any](s1, s2 []T, cmp func(T, T) intint 
  12.  
  13. func Index[T comparable](s []T, v T) int 
  14.  
  15. func IndexFunc[T any](s []T, f func(T) bool) int 
  16.  
  17. func Contains[T comparable](s []T, v T) bool 
  18.  
  19. func Insert[S constraints.Slice[T], T any](s S, i int, v ...T) S 
  20.  
  21. func Delete[S constraints.Slice[T], T any](s S, i, j int) S 
  22.  
  23. func Clone[S constraints.Slice[T], T any](s S) S 
  • Equal:檢查兩個切片是否相等,以長度和元素值來比較。
  • EqualFunc:檢查兩個切片是否相等,以所傳入的匹配函數(shù)來比較。
  • Compare/CompareFunc:
    • Compare 比較兩個切片 s1 和 s2 的元素。
    • CompareFunc 與 Compare 類似,在每一對元素上使用所傳入的比較函數(shù)。
  • Index:
    • Index 返回值 v 在切片 s 中第一次出現(xiàn)的索引,如果不存在,則返回-1。
    • IndexFunc 返回滿足f(c)的第一個元素在s中的索引,如果沒有則返回-1。
  • Contains:檢查值 v 是否存在于切片 s 中。

插入、刪除、克隆的 API 比較常見,這里我就不展開了。在通用類型的切片有一些比較特殊的 API:

  1. func Compact[S constraints.Slice[T], T comparable](s S) S 
  2.  
  3. func CompactFunc[S constraints.Slice[T], T any](s S, cmp func(T, T) bool) S 
  4.  
  5. func Grow[S constraints.Slice[T], T any](s S, n int) S 
  6.  
  7. func Clip[S constraints.Slice[T], T any](s S) S 
  • Compact/CompactFunc:
    • Compact 將連續(xù)運行的相等元素替換為單一的副本。這就像 Unix 中的 uniq 命令。會直接修改切片 s 的內容,不會重新創(chuàng)建一個。
    • CompactFunc 與 Compact 方法類似,但是使用一個比較函數(shù)來匹配。
  • Grow:如果有必要,Grow 會增長切片的容量,以保證另外 n 個元素的空間。在 Grow(n) 之后,至少有 n 個元素可以被添加到分片中而不需要再分配。如果 n 是負數(shù)或者太大,無法分配內存,Grow 將陷入恐慌。
  • Clip:從切片中移除未使用的容量,返回s[:len(s):len(s)]。

總結

如果這些提議被接受,這幾個新包將被包含在實現(xiàn)泛型后的第一個Go版本中(我們目前預計將是Go 1.18)。

從issues 的討論來看,通用類型的新包支持很大概率會實現(xiàn),主要爭議在實現(xiàn)細節(jié),例如:性能、命名、規(guī)范等。

實現(xiàn)后值得期待,又是一次生產力的優(yōu)化!

 

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

2021-11-27 22:20:13

SlicesGo泛型

2021-12-05 23:45:23

Go泛型Maps

2021-12-01 08:29:17

Go泛型Maps

2023-11-03 14:02:04

Go切片泛型庫

2021-12-13 08:52:42

Go 泛型

2023-05-05 08:51:18

Go語言泛型

2021-01-14 05:20:48

Go語言泛型

2021-02-05 16:26:08

Go開發(fā)者提案

2022-04-28 12:00:34

Go泛型版排序

2021-09-29 18:17:30

Go泛型語言

2023-09-27 08:26:48

Go標準庫函數(shù)

2021-12-30 18:34:29

緩存GoSinglefligh

2025-04-14 08:49:10

2021-02-25 15:51:41

Go語言模糊測試功能

2024-10-28 00:40:49

Go語法版本

2023-12-27 08:03:53

Go優(yōu)化代碼

2021-12-15 12:59:56

Go泛型版Beta1

2022-03-28 13:34:26

Go泛型部署泛型

2023-11-29 08:19:45

Go泛型缺陷

2025-02-08 11:00:33

點贊
收藏

51CTO技術棧公眾號