最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go1.21新增slices包的用法詳解

 更新時(shí)間:2023年08月17日 08:41:38   作者:路多辛  
Go?1.21新增的?slices?包提供了很多和切片相關(guān)的函數(shù),可以用于任何類型的切片,這篇文章主要來和大家介紹一下slices包中相關(guān)函數(shù)的用法,需要的可以參考一下

slices.BinarySearch

定義如下:

func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool)

在已經(jīng)排好序的切片(切片必須按遞增順序排序)中搜索目標(biāo),如果找到了,返回所在的位置和 true,如果沒有找到,則返回目標(biāo)應(yīng)該被找到的位置和 false,簡單示例如下:

package main
import (
    "fmt"
    "slices"
)
func main() {
    names := []string{"Alice", "Bob", "Vera"}
    n, found := slices.BinarySearch(names, "Vera")
    fmt.Println("Vera:", n, found) // Vera: 2 true
    n, found = slices.BinarySearch(names, "Bill")
    fmt.Println("Bill:", n, found) // Bill: 1 false
}

slices.BinarySearchFunc

定義如下:

func BinarySearchFunc[S ~[]E, E, T any](x S, target T, cmp func(E, T) int) (int, bool)

作用類似 slices.BinarySearch,不同的是使用自定義比較函數(shù)。切片必須按遞增順序排序,其中“遞增”是由cmp定義的。如果 slice 元素與目標(biāo)匹配,CMP應(yīng)該返回 0,如果 slice元素在目標(biāo)之前,則返回一個(gè)負(fù)數(shù),如果 slice 元素在目標(biāo)之后,則返回一個(gè)正數(shù)。CMP必須實(shí)現(xiàn)與片相同的排序,這樣,如果CMP (a, t) < 0且CMP (b, t) >= 0,則切中的 a 必須位于 b 之前。

package main
import (
    "cmp"
    "fmt"
    "slices"
)
func main() {
    type Person struct {
        Name string
        Age  int
    }
    people := []Person{
        {"Alice", 55},
        {"Bob", 24},
        {"Gopher", 13},
    }
    n, found := slices.BinarySearchFunc(people, Person{"Bob", 0}, func(a, b Person) int {
        return cmp.Compare(a.Name, b.Name)
    })
    fmt.Println("Bob:", n, found) // Bob: 1 true
}

slices.Clip

定義如下:

func Clip[S ~[]E, E any](s S) S

從切片中刪除未使用的容量,返回 s[:len(s):len(s)]。簡單示例如下:

package main
import (
    "fmt"
    "slices"
)
func main() {
    names := make([]string, 2, 5)
    names = slices.Clip(names)
    fmt.Printf("長度:%d,容量:%d", len(names), cap(names))
  // 長度:2,容量:2
}

slices.Clone

定義如下:

func Clone[S ~[]E, E any](s S) S

返回切片的副本。因?yàn)樵厥鞘褂觅x值方式復(fù)制的,所以這是一個(gè)淺克隆。簡單實(shí)用方法如下:

package main
import (
    "fmt"
    "slices"
)
func main() {
    names := []string{"路多辛的博客", "路多辛的所思所想"}
    namesCopy := slices.Clone(names)
    fmt.Println(namesCopy)
}

slices.Compact

定義如下:

func Compact[S ~[]E, E comparable](s S) S

將連續(xù)出現(xiàn)的元素變?yōu)橐粋€(gè),類似于 Unix 上的 uniq 命令。Compact 會(huì)修改片的內(nèi)容并返回修改后的片,長度可能會(huì)變得更小。簡單示例如下:

package main
import (
    "fmt"
    "slices"
)
func main() {
    seq := []int{0, 1, 1, 2, 5, 5, 5, 8}
    seq = slices.Compact(seq)
    fmt.Println(seq) // [0 1 2 5 8]
}

slices.CompactFunc

定義如下:

func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S

類似于 slices.Compact,不同的是使用自定義的函數(shù)來比較元素。如果元素的運(yùn)行結(jié)果相等,CompactFunc 將保留第一個(gè)元素。簡單示例如下:

package main
import (
    "fmt"
    "slices"
    "strings"
)
func main() {
    names := []string{"bob", "Bob", "alice", "Vera", "VERA"}
    names = slices.CompactFunc(names, func(a, b string) bool {
        return strings.ToLower(a) == strings.ToLower(b)
    })
    fmt.Println(names) // [bob alice Vera]
}

slices.Compare

定義如下:

func Compare[S ~[]E, E cmp.Ordered](s1, s2 S) int

使用 cmp.Compare函數(shù)來比較 s1 和 s2 的元素。按照順序比較每一對元素,直到一個(gè)元素不等于另一個(gè)元素。返回第一個(gè)不匹配元素的結(jié)果。如果兩個(gè)切片在其中一個(gè)結(jié)束之前相等,則認(rèn)為較短的切片小于較長的切片。如果 s1 == s2,結(jié)果為0;如果 s1 < s2,結(jié)果為-1;如果 s1 > s2,結(jié)果為1。

package main
import (
    "fmt"
    "slices"
)
func main() {
    names := []string{"Alice", "Bob", "Vera"}
    fmt.Println("Equal:", slices.Compare(names, []string{"Alice", "Bob", "Vera"}))
    fmt.Println("V < X:", slices.Compare(names, []string{"Alice", "Bob", "Xena"}))
    fmt.Println("V > C:", slices.Compare(names, []string{"Alice", "Bob", "Cat"}))
    fmt.Println("3 > 2:", slices.Compare(names, []string{"Alice", "Bob"}))
}

運(yùn)行結(jié)果如下:

Equal: 0
V < X: -1
V > C: 1
3 > 2: 1

slices.CompareFunc

定義如下:

func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int

類似于 slices.Compare,不同的是使用自定義的比較函數(shù)進(jìn)行比較。結(jié)果是 cmp 的第一個(gè)非零結(jié)果;如果 cmp 總是返回0,則如果 len(s1) == len(s2) 結(jié)果為0,如果len(s1) < len(s2)結(jié)果為-1,如果 len(s1) > len(s2) 結(jié)果為1。簡單示例如下:

package main
import (
    "cmp"
    "fmt"
    "slices"
    "strconv"
)
func main() {
    numbers := []int{0, 43, 8}
    strings := []string{"0", "0", "8"}
    result := slices.CompareFunc(numbers, strings, func(n int, s string) int {
        sn, err := strconv.Atoi(s)
        if err != nil {
            return 1
        }
        return cmp.Compare(n, sn)
    })
    fmt.Println(result) // 1
}

slices.Contains

定義如下:

func Contains[S ~[]E, E comparable](s S, v E) bool

用于判斷 s 是否包含 v。簡單示例如下:

package main
import (
    "fmt"
    "slices"
)
func main() {
    names := []string{"Alice", "Bob", "Vera"}
    fmt.Println(slices.Contains(names, "Bob")) // true
}

slices.ContainsFunc

定義如下:

func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool

用于判斷 s 中是否至少有一個(gè)元素 e 滿足 f(e)。簡單示例如下:

package main
import (
    "fmt"
    "slices"
)
func main() {
    numbers := []int{0, 42, -10, 8}
    hasNegative := slices.ContainsFunc(numbers, func(n int) bool {
        return n < 0
    })
    fmt.Println("Has a negative:", hasNegative)// true
    hasOdd := slices.ContainsFunc(numbers, func(n int) bool {
        return n%2 != 0
    })
    fmt.Println("Has an odd number:", hasOdd) // false
}

【參考資料】

Package slices(https://golang.google.cn/pkg/slices/

以上就是Go1.21新增slices包的用法詳解的詳細(xì)內(nèi)容,更多關(guān)于Go1.21 slices包的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解golang RWMutex讀寫互斥鎖源碼分析

    詳解golang RWMutex讀寫互斥鎖源碼分析

    這篇文章主要介紹了詳解golang RWMutex讀寫互斥鎖源碼分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 一文初探Go語言中的reflect反射包

    一文初探Go語言中的reflect反射包

    這篇文章主要和大家分享一下Go語言中的reflect反射包,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • Go sync WaitGroup使用深入理解

    Go sync WaitGroup使用深入理解

    這篇文章主要為大家介紹了Go sync WaitGroup使用深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • go語言搬磚之go jmespath實(shí)現(xiàn)查詢json數(shù)據(jù)

    go語言搬磚之go jmespath實(shí)現(xiàn)查詢json數(shù)據(jù)

    這篇文章主要為大家介紹了go語言搬磚之go jmespath實(shí)現(xiàn)查詢json數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang日志庫logrus的介紹與使用示例代碼

    Golang日志庫logrus的介紹與使用示例代碼

    Logrus是Go語言的一個(gè)功能豐富的日志庫,支持結(jié)構(gòu)化日志和多級別日志記錄,它兼容標(biāo)準(zhǔn)log庫,并可通過自定義Hooks和Formatter進(jìn)行高度定制化,支持集成如syslog等系統(tǒng),便于管理和分析,Logrus還支持自定義日志顏色和格式,以及根據(jù)日志級別進(jìn)行不同處理,如panic和exit
    2024-10-10
  • Golang?中實(shí)現(xiàn)?Set的思路詳解

    Golang?中實(shí)現(xiàn)?Set的思路詳解

    本文介紹了Go中兩種set的實(shí)現(xiàn)原理,并在此基礎(chǔ)介紹了對應(yīng)于它們的兩個(gè)包簡單使用,本文介紹的非常詳細(xì),需要的朋友參考下吧
    2024-01-01
  • 將Go項(xiàng)目發(fā)布到Go官方倉庫的完整流程

    將Go項(xiàng)目發(fā)布到Go官方倉庫的完整流程

    本文詳細(xì)介紹了如何將Go項(xiàng)目發(fā)布到Go官方倉庫(通過GoModuleProxy),包括準(zhǔn)備工作、項(xiàng)目結(jié)構(gòu)設(shè)計(jì)、Go模塊初始化、代碼質(zhì)量保障、提交到代碼托管平臺(tái)、發(fā)布版本、使用GoModuleProxy、維護(hù)和更新等內(nèi)容,幫助開發(fā)者輕松分享自己的技術(shù)成果,需要的朋友可以參考下
    2026-05-05
  • Go語言編程入門超級指南

    Go語言編程入門超級指南

    這篇文章主要介紹了Go語言編程的入門指南,包括對Go的變量及函數(shù)的基本介紹,需要的朋友可以參考下
    2016-01-01
  • Golang編程實(shí)現(xiàn)生成n個(gè)從a到b不重復(fù)隨機(jī)數(shù)的方法

    Golang編程實(shí)現(xiàn)生成n個(gè)從a到b不重復(fù)隨機(jī)數(shù)的方法

    這篇文章主要介紹了Golang編程實(shí)現(xiàn)生成n個(gè)從a到b不重復(fù)隨機(jī)數(shù)的方法,結(jié)合實(shí)例形式分析了Go語言字符串操作及隨機(jī)數(shù)生成的相關(guān)操作技巧,需要的朋友可以參考下
    2017-01-01
  • Go 中閉包的底層原理

    Go 中閉包的底層原理

    這篇文章主要介紹了Go 中閉包的底層原理,閉包的基本原理是一種現(xiàn)象,一個(gè)函數(shù)內(nèi)引用了外部的局部變量的現(xiàn)象,帶著些許的了解和小編一起進(jìn)入文章正題學(xué)習(xí)
    2021-10-10

最新評論

昌平区| 泰和县| 绍兴县| 南川市| 昌图县| 驻马店市| 榆社县| 武冈市| 罗城| 东山县| 陆良县| 邹平县| 牟定县| 清徐县| 罗田县| 惠水县| 汉源县| 十堰市| 微博| 喀喇沁旗| 夹江县| 荣成市| 夏津县| 长子县| 峨边| 南华县| 绥化市| 鞍山市| 开化县| 白山市| 平乡县| 新和县| 甘洛县| 栾川县| 临洮县| 那坡县| 松溪县| 华坪县| 湘乡市| 农安县| 句容市|