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

Go1.21 速覽:過了一年半,Slices、Maps 泛型庫終于要加入標(biāo)準(zhǔn)庫......

開發(fā) 前端
Go 語言加不加泛型,怎么加泛型。吵了十多年,才把泛型這個(gè)新特性納入進(jìn)來。又花了一年半的時(shí)間,才把標(biāo)準(zhǔn)庫最常見用的 slices、maps 泛型再逐步納入進(jìn)來。

大家好,我是煎魚。

在 2022 年 3 月,Go1.18 終于發(fā)布。在該版本中,包含了 Go1.17 起就已存在的泛型,并于此版本正式發(fā)布泛型特性。

這是一個(gè)備受關(guān)注和爭議的新特性。在 reddit 甚至有網(wǎng)友放出了這張圖:

圖片

泛型庫終于合進(jìn) master

曾經(jīng)在 Go1.18 時(shí),Go 語言之父 @Rob Pike 冒了個(gè)泡,掌了舵,讓不要這么急把泛型重寫進(jìn)標(biāo)準(zhǔn)庫。怕太著急,對(duì)泛型不熟會(huì)翻車。

如下圖:

圖片

在經(jīng)歷了一年半的等待后,最近 Go slices 和 maps 的泛型庫,終于被合并進(jìn) master 分支了。這意味著在 Go1.21 起,將會(huì)有泛型庫進(jìn)入官方標(biāo)準(zhǔn)庫。

圖片

這相當(dāng)于是個(gè)比較有標(biāo)志性的節(jié)點(diǎn)了。

以下我們先看看一個(gè)簡單的泛型 Demo,再看看具體的 slices 和 maps 的泛型標(biāo)準(zhǔn)庫庫的 API 和使用方式。

泛型 Demo

以下是社區(qū)提供的一個(gè)泛型快速 Demo,可以跟著思考運(yùn)行一下,看看自己泛型的基本使用掌握的如何。

代碼如下:

package main

import "fmt"

func MapKeys[K comparable, V any](m map[K]V) []K {
    r := make([]K, 0, len(m))
    for k := range m {
        r = append(r, k)
    }
    return r
}

type List[T any] struct {
    head, tail *element[T]
}

type element[T any] struct {
    next *element[T]
    val  T
}

func (lst *List[T]) Push(v T) {
    if lst.tail == nil {
        lst.head = &element[T]{val: v}
        lst.tail = lst.head
    } else {
        lst.tail.next = &element[T]{val: v}
        lst.tail = lst.tail.next
    }
}

func (lst *List[T]) GetAll() []T {
    var elems []T
    for e := lst.head; e != nil; e = e.next {
        elems = append(elems, e.val)
    }
    return elems
}

func main() {
    var m = map[int]string{1: "2", 2: "4", 4: "8"}

    fmt.Println("keys:", MapKeys(m))

    _ = MapKeys[int, string](m)

    lst := List[int]{}
    lst.Push(10)
    lst.Push(13)
    lst.Push(23)
    fmt.Println("list:", lst.GetAll())
}

輸出結(jié)果:

keys: [4 1 2]
list: [10 13 23]

泛型 slices

以下給大家介紹泛型 slices 庫的 API 和對(duì)應(yīng)的用法。如果有看源碼的興趣,可以查看 src/slices/slices.go 文件。

圖片

其包含如下方法:

func BinarySearch[E constraints.Ordered](x []E, target E) (int, bool)
func BinarySearchFunc[E, T any](x []E, target T, cmp func(E, T) int) (int, bool)
  • BinarySearch:在已排序的切片中搜索目標(biāo),并返回找到目標(biāo)的位置,或者目標(biāo)在排序順序中出現(xiàn)的位置;函數(shù)會(huì)返回一個(gè) bool 值,表示是否真的在切片中找到目標(biāo)。切片必須按遞增順序排序。
  • BinarySearchFunc:同上類似用法,區(qū)別在于可以傳自己定義的比較函數(shù)。
func Clip[S ~[]E, E any](s S) S
func Clone[S ~[]E, E any](s S) S
func Compact[S ~[]E, E comparable](s S) S
func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S
func Compare[E constraints.Ordered](s1, s2 []E) int
func CompareFunc[E1, E2 any](s1 []E1, s2 []E2, cmp func(E1, E2) int) int
  • Clip:從切片中刪除未使用的容量,返回 s[:len(s):len(s)]。
  • Clone:拷貝切片的副本,切片元素是使用賦值復(fù)制的,是淺拷貝。
  • Compact:將連續(xù)運(yùn)行的相等元素替換為單個(gè)副本。類似于 Unix 的 uniq 命令。該函數(shù)會(huì)直接修改切片的元素,它不會(huì)創(chuàng)建新切片。
  • CompactFunc:同上類似用法,區(qū)別在于可傳自定義函數(shù)進(jìn)行比較。
func Contains[E comparable](s []E, v E) bool
func ContainsFunc[E any](s []E, f func(E) bool) bool
func Delete[S ~[]E, E any](s S, i, j int) S
  • Contains:在切片中查找所傳入的參數(shù)是否存在,返回一個(gè) bool 值。
  • ContainsFunc:同上,可傳自定義函數(shù)。
  • Delete:從切片中刪除元素 s[i:j],返回被修改(刪除元素)后的切片。
func Equal[E comparable](s1, s2 []E) bool
func EqualFunc[E1, E2 any](s1 []E1, s2 []E2, eq func(E1, E2) bool) bool
func Grow[S ~[]E, E any](s S, n int) S
  • Equal:檢查兩個(gè)所傳入的切片是否相等,需要確保長度相同,所有元素相等。如果長度不同,也是會(huì)返回 false。
  • EqualFunc:同上,可傳自定義函數(shù)。
  • Grow:增加切片的容量,至少增加 n 個(gè)元素的空間。如果 n 是負(fù)數(shù)或者太大,無法分配內(nèi)存,就會(huì)導(dǎo)致產(chǎn)生 panic。
func Index[E comparable](s []E, v E) int
func IndexFunc[E any](s []E, f func(E) bool) int
func Insert[S ~[]E, E any](s S, i int, v ...E) S
func Replace[S ~[]E, E any](s S, i, j int, v ...E) S
  • Index:返回所需檢查元素在切片中第一次出現(xiàn)的索引位置。如果不存在,則返回 -1。
  • IndexFunc:同上,可傳自定義函數(shù)。
  • Replace:用所傳入的參數(shù)替換對(duì)應(yīng)的元素,并返回修改后的切片。
func IsSorted[E constraints.Ordered](x []E) bool
func IsSortedFunc[E any](x []E, less func(a, b E) bool) bool
func Sort[E constraints.Ordered](x []E)
func SortFunc[E any](x []E, less func(a, b E) bool)
func SortStableFunc[E any](x []E, less func(a, b E) bool)
  • IsSorted:檢查所傳入的切片是否以升序排序。
  • IsSortedFunc:同上,可傳自定義函數(shù)。
  • Sort:按升序?qū)θ我庥行蝾愋偷那衅M(jìn)行排序。
  • SortFunc:同上,可傳自定義函數(shù)。
  • SortStableFunc:對(duì)所傳入的切片進(jìn)行排序,同時(shí)保持相等元素的原始順序,使用較少的元素進(jìn)行比較。

泛型 maps

以下給大家介紹泛型庫的 API 和對(duì)應(yīng)的用法。如果有看源碼的興趣,可以查看 src/maps/maps.go 文件。

圖片

其包含如下方法:

func Keys[M ~map[K]V, K comparable, V any](m M) []K
func Values[M ~map[K]V, K comparable, V any](m M) []V
func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool
func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool
  • Keys:返回 map 的鍵值內(nèi)容,鍵值將以不確定的順序出現(xiàn)。
  • Values:返回 map 的值,值將以不確定的順序出現(xiàn)。
  • Equal:檢查兩個(gè)地圖是否包含相同的鍵/值對(duì),內(nèi)部會(huì)使用 == 來比較數(shù)值。
  • EqualFunc:EqualFunc與 Equal 方法類似,但使用閉包方法來比較數(shù)值,鍵值仍然用 == 來比較。
func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool)
func Clear[M ~map[K]V, K comparable, V any](m M)
func Clone[M ~map[K]V, K comparable, V any](m M) M
func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2)
  • DeleteFunc:刪除 map 中閉包方法返回 true 的任何鍵/值對(duì)。
  • Clear:清除從 map 中刪除所有條目,使之為空。
  • Clone:返回一個(gè) map 的副本,這是一個(gè)淺層克隆,新拷貝出來的的鍵和值使用普通的賦值來設(shè)置。
  • Copy:復(fù)制 src 中的所有鍵/值對(duì),并將其加入 dst。當(dāng) src 中的一個(gè)鍵已經(jīng)存在于 dst 中時(shí),dst 中的值將被與 src 中的鍵相關(guān)的值所覆蓋。

總結(jié)

Go 語言加不加泛型,怎么加泛型。吵了十多年,才把泛型這個(gè)新特性納入進(jìn)來。又花了一年半的時(shí)間,才把標(biāo)準(zhǔn)庫最常見用的 slices、maps 泛型再逐步納入進(jìn)來。

雖然聽起來一切都是那么的讓人激動(dòng)。但你細(xì)數(shù)一下時(shí)間,其實(shí)是比較久的。等 Go 官方庫都能夠叱咤泛型,可能還需要相當(dāng)一段的時(shí)間。

你在你的 Go 項(xiàng)目代碼中用上了嗎?

責(zé)任編輯:武曉燕 來源: 腦子進(jìn)煎魚了
相關(guān)推薦

2023-06-07 10:32:57

內(nèi)置函數(shù)clear

2023-11-03 14:02:04

Go切片泛型庫

2023-06-19 08:49:55

go文件管理

2021-08-09 10:36:20

GoSlices Maps

2023-08-09 08:53:50

GoWASI語義

2021-11-27 22:20:13

SlicesGo泛型

2023-06-29 08:47:59

GoContext設(shè)置

2023-09-27 08:26:48

Go標(biāo)準(zhǔn)庫函數(shù)

2021-12-05 23:45:23

Go泛型Maps

2021-12-01 08:29:17

Go泛型Maps

2022-11-08 08:29:43

Goslog 庫工具

2021-10-18 10:53:26

Go 代碼技術(shù)

2011-02-21 10:26:41

人才

2023-07-05 08:47:24

Go版本團(tuán)隊(duì)

2012-03-17 19:41:08

蘋果

2023-03-28 23:32:38

2009-02-06 09:47:42

蘋果iPhone中國移動(dòng)

2024-02-02 21:39:04

AI模型

2021-01-14 05:20:48

Go語言泛型

2018-04-09 14:26:06

Go語法實(shí)踐
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品a免费一区久久电影 | 天天色天天色 | 99爱在线免费观看 | 在线观看久草 | 99精品免费久久久久久日本 | 毛片一区二区三区 | 久久久久国产精品 | 91亚洲国产成人久久精品网站 | 免费骚视频 | 亚洲免费在线观看 | www.亚洲国产精品 | 国产在线观看网站 | 天天干天天操天天爽 | 老司机深夜福利网站 | 日韩色图视频 | 免费午夜剧场 | 四虎成人免费视频 | 黄色大片免费播放 | 久久综合久久久 | 亚洲综合色视频在线观看 | 一级黄色绿像片 | 91亚洲精品国偷拍自产在线观看 | 97国产在线观看 | 中文字幕 欧美 日韩 | 北条麻妃国产九九九精品小说 | 色黄视频在线 | 久久av网 | 有码一区 | 天天天天操 | 99热视| 久久伊| 久久精品小视频 | 99国产精品视频免费观看一公开 | 神马福利| 亚洲专区在线 | 一区二区精品视频 | 超碰地址 | 欧美日韩国产欧美 | 久久综合婷婷 | 成年免费大片黄在线观看岛国 | 精品国产视频 |