国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

slices in Go 1.21

這篇具有很好參考價(jià)值的文章主要介紹了slices in Go 1.21。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Go 1.21中新增的 slices包中提供了很多與切片相關(guān)的函數(shù),適用于任意類型的切片。

本文內(nèi)容來自官方文檔

BinarySearch

函數(shù)簽名如下:

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

BinarySearch在已排序的切片中搜索 target 并返回找到 target 的位置,或者 target 在排序順序中出現(xiàn)的位置;它還返回一個(gè)布爾值,表示是否確實(shí)在切片中找到了目標(biāo)。切片必須按升序排序。

示例:

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
}

BinarySearchFunc

函數(shù)簽名如下:

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

BinarySearchFunc的工作方式類似于BinarySearch,但使用自定義比較函數(shù)。切片必須按遞增順序排序,其中“遞增”由cmp定義。如果切片元素與目標(biāo)匹配,則cmp應(yīng)返回0;如果切片元素在目標(biāo)之前,則返回負(fù)數(shù);如果切片元素在目標(biāo)之后,則返回正數(shù)。cmp必須實(shí)現(xiàn)與切片相同的排序,這樣如果cmp(a, t) < 0cmp(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
}

Clip

函數(shù)簽名如下:

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

Clip從切片中刪除未使用的容量,返回s[:len(s):len(s)]

Clone

函數(shù)簽名如下:

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

Clone返回切片的副本。使用賦值來復(fù)制元素,因此這是淺拷貝。

Compact

函數(shù)簽名如下:

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

Compact用單個(gè)副本替換連續(xù)運(yùn)行的相同元素。這類似于Unix上的uniq命令。Compact修改切片s的內(nèi)容并返回修改后的切片,該切片的長度可能更小。當(dāng)Compact總共丟棄m個(gè)元素時(shí),它可能不會(huì)修改元素s[len(s)-m:len(s)]。如果這些元素包含指針,可能要考慮將這些元素清零,以便它們引用的對象可以被回收。

示例:

package main

import (
	"fmt"
	"slices"
)

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

CompactFunc

函數(shù)簽名如下:

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

CompactFunc類似于Compact,但使用相等函數(shù)來比較元素。對于比較相等的元素運(yùn)行,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]
}

Compare

函數(shù)簽名如下:

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

Compare對每對元素使用cmp.Compare來比較s1s2的元素。從索引0開始按順序比較元素,直到一個(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"}))      // Equal: 0
	fmt.Println("V < X:", slices.Compare(names, []string{"Alice", "Bob", "Xena"}))      // V < X: -1
	fmt.Println("V > C:", slices.Compare(names, []string{"Alice", "Bob", "Cat"}))       // V > C: 1
	fmt.Println("3 > 2:", slices.Compare(names, []string{"Alice", "Bob"}))              // 3 > 2: 1
}

CompareFunc

函數(shù)簽名如下:

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

CompareFunc類似于Compare,但對每對元素使用自定義比較函數(shù)。結(jié)果是cmp的第一個(gè)非零結(jié)果;如果cmp始終返回0

  • 如果len(s1) == len(s2),則結(jié)果為0
  • 如果len(s1) < len(s2),則結(jié)果為-1;
  • 如果len(s1) > len(s2),則結(jié)果為 +1。

示例:

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
}

Contains

函數(shù)簽名如下:

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

Contains返回v是否存在于s中。

ContainsFunc

函數(shù)簽名如下:

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

ContainsFunc返回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)         // Has a negative: true
	hasOdd := slices.ContainsFunc(numbers, func(n int) bool {
		return n%2 != 0
	})
	fmt.Println("Has an odd number:", hasOdd)           // Has an odd number: false
}

Delete

函數(shù)簽名如下:

func Delete[S ~[]E, E any](s S, i, j int) S

Deletes中刪除元素s[i:j],返回修改后的切片。如果s[i:j]不是s的有效切片,則產(chǎn)生panic。刪除的時(shí)間復(fù)雜度為O(len(s)-j),因此如果必須刪除許多項(xiàng),最好通過一次調(diào)用將它們?nèi)縿h除,而不是一次刪除一項(xiàng)。刪除可能不會(huì)修改元素s[len(s)-(j-i):len(s)]。如果這些元素包含指針,還需要考慮將這些元素歸零,以便它們引用的對象可以被回收。

示例:

package main

import (
	"fmt"
	"slices"
)

func main() {
	letters := []string{"a", "b", "c", "d", "e"}
	letters = slices.Delete(letters, 1, 4)
	fmt.Println(letters)    // [a e]
}

DeleteFunc

函數(shù)簽名如下:

func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S

DeleteFuncs中刪除函數(shù)del(e)返回true的所有元素,并返回修改后的切片。當(dāng)DeleteFunc刪除m個(gè)元素時(shí),它可能不會(huì)修改元素s[len(s)-m:len(s)]。如果這些元素包含指針,還需要考慮將這些元素歸零,以便它們引用的對象可以被回收。

示例:

package main

import (
	"fmt"
	"slices"
)

func main() {
	seq := []int{0, 1, 1, 2, 3, 5, 8}
	seq = slices.DeleteFunc(seq, func(n int) bool {
		return n%2 != 0 // delete the odd numbers
	})
	fmt.Println(seq)        // [0 2 8]
}

Equal

函數(shù)簽名如下:

func Equal[S ~[]E, E comparable](s1, s2 S) bool

Equal報(bào)告兩個(gè)切片是否相等:長度相同且所有元素相等,返回true。如果長度不同,返回false。否則,按遞增的索引順序比較元素,并且比較在第一個(gè)不相等的對處停止。浮點(diǎn)NaN不被視為相等。

示例:

package main

import (
	"fmt"
	"slices"
)

func main() {
	numbers := []int{0, 42, 8}
	fmt.Println(slices.Equal(numbers, []int{0, 42, 8}))     // true
	fmt.Println(slices.Equal(numbers, []int{10}))           // false
}

EqualFunc

func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool

EqualFunc在每對元素上使用相等函數(shù)來報(bào)告兩個(gè)切片是否相等。如果長度不同,EqualFunc返回false。否則,按遞增索引順序比較元素,并且比較在eq返回false的第一個(gè)索引處停止。

示例:

package main

import (
	"fmt"
	"slices"
	"strconv"
)

func main() {
	numbers := []int{0, 42, 8}
	strings := []string{"000", "42", "0o10"}
	equal := slices.EqualFunc(numbers, strings, func(n int, s string) bool {
		sn, err := strconv.ParseInt(s, 0, 64)
		if err != nil {
			return false
		}
		return n == int(sn)
	})
	fmt.Println(equal)      // true
}

Grow

函數(shù)簽名如下:

func Grow[S ~[]E, E any](s S, n int) S

必要時(shí),Grow會(huì)增加切片的容量,以保證另外n個(gè)元素的空間。在Grow(n)之后,至少可以將n個(gè)元素附加到切片,而無需再次分配。如果n為負(fù)數(shù)或太大而無法分配內(nèi)存,Grow 會(huì)出現(xiàn)panic。

Index

函數(shù)簽名如下:

func Index[S ~[]E, E comparable](s S, v E) int

Index返回vs中第一次出現(xiàn)的索引,如果不存在則返回-1。

示例:

package main

import (
	"fmt"
	"slices"
)

func main() {
	numbers := []int{0, 42, 8}
	fmt.Println(slices.Index(numbers, 8))       // 2
	fmt.Println(slices.Index(numbers, 7))       // -1
}

IndexFunc

函數(shù)簽名如下:

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

Index返回s中第一次符合f(e)的元素的索引,如果不存在則返回-1

示例:

package main

import (
	"fmt"
	"slices"
)

func main() {
	numbers := []int{0, 42, -10, 8}
	i := slices.IndexFunc(numbers, func(n int) bool {
		return n < 0
	})
	fmt.Println("First negative at index", i)       // First negative at index 2
}

Insert

函數(shù)簽名如下:

func Insert[S ~[]E, E any](s S, i int, v ...E) S

Insert將值v...插入到索引i處的s中,返回修改后的切片。s[i:]處的元素向上移動(dòng)以騰出空間。在返回的切片r中,r[i] == v[0],并且r[i+len(v)] == 最初位于r[i]的值。如果i超出范圍,則panic。該函數(shù)的復(fù)雜度為O(len(s) + len(v))

示例:

package main

import (
	"fmt"
	"slices"
)

func main() {
	names := []string{"Alice", "Bob", "Vera"}
	names = slices.Insert(names, 1, "Bill", "Billie")
	names = slices.Insert(names, len(names), "Zac")
	fmt.Println(names)  // [Alice Bill Billie Bob Vera Zac]
}

IsSorted

函數(shù)簽名如下:

func IsSorted[S ~[]E, E cmp.Ordered](x S) bool

IsSorted返回x是否按升序排序。

示例:

package main

import (
	"fmt"
	"slices"
)

func main() {
	fmt.Println(slices.IsSorted([]string{"Alice", "Bob", "Vera"}))      // true
	fmt.Println(slices.IsSorted([]int{0, 2, 1}))                        // false
}

IsSortedFunc

函數(shù)簽名如下:

func IsSortedFunc[S ~[]E, E any](x S, cmp func(a, b E) int) bool

IsSortedFunc返回x是否按升序排序,使用cmp作為比較函數(shù)。

示例:

package main

import (
	"cmp"
	"fmt"
	"slices"
	"strings"
)

func main() {
	names := []string{"alice", "Bob", "VERA"}
	isSortedInsensitive := slices.IsSortedFunc(names, func(a, b string) int {
		return cmp.Compare(strings.ToLower(a), strings.ToLower(b))
	})
	fmt.Println(isSortedInsensitive)        // true
	fmt.Println(slices.IsSorted(names))     // false
}

slices in Go 1.21

聲明:本作品采用署名-非商業(yè)性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)進(jìn)行許可,使用時(shí)請注明出處。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 戀水無意文章來源地址http://www.zghlxwxcb.cn/news/detail-710550.html


到了這里,關(guān)于slices in Go 1.21的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • go 1.21:cmp

    go 1.21:cmp

    原文在這里 go 1.21 新增 cmp 包提供了與有序變臉比較相關(guān)的類型和函數(shù)。 定義如下: Ordered 是一個(gè)約束,它允許任何有序類型:任何支持 、 = 、 = 、 運(yùn)算符的類型。如果 Go 的未來版本添加了新的有序類型,這個(gè)約束將被修改以包含它們。 請注意,浮點(diǎn)類型可能包含 NaN (

    2024年02月10日
    瀏覽(12)
  • Go 自學(xué):切片slices

    以下代碼展示了兩種建立slice的方法。 我們可以使用sort函數(shù)給slice排序。 輸出為: Type of fruitlist is []string [Apple Tomato Peach Mango Banana] [Apple Tomato Peach] [234 945 465 867 555 666 321] false [234 321 465 555 666 867 945] 以下代碼展示了如何根據(jù)index從slice中移除指定元素。

    2024年02月11日
    瀏覽(22)
  • 【Go】Go 語言教程--GO語言切片(Slice)(十四)

    往期回顧: Go 語言教程–介紹(一) Go 語言教程–語言結(jié)構(gòu)(二) Go 語言教程–語言結(jié)構(gòu)(三) Go 語言教程–數(shù)據(jù)類型(四) Go 語言教程–語言變量(五) Go 語言教程–GO語言常量(六) Go 語言教程–GO語言運(yùn)算符(七) Go 語言教程–GO條件和循環(huán)語句(八) Go 語言教程

    2024年02月16日
    瀏覽(18)
  • Go 切片Slice的長度len與容量cap

    0x00 簡介 Go 語言之旅示例 切片的長度與容量 切片擁有長度和容量。 切片的長度是它所包含的元素個(gè)數(shù)。 切片的容量是從它的第一個(gè)元素開始數(shù),到其底層數(shù)組元素末尾的個(gè)數(shù)。 切片 s 的長度和容量可通過表達(dá)式 len(s) 和 cap(s) 來獲取。 package main import \\\"fmt\\\" func main() { ?? ?

    2024年02月09日
    瀏覽(18)
  • 使用go mod tidy命令出現(xiàn)go.mod file indicates go 1.21, but maximum supported version is 1.19,如何解決

    使用go mod tidy命令出現(xiàn)go.mod file indicates go 1.21, but maximum supported version is 1.19,如何解決

    使用git拉取代碼Golang代碼到本地后,利用VS Code打開項(xiàng)目后,看到go.mod報(bào)紅,現(xiàn)象如下圖所示:` 這個(gè)問題是當(dāng)前使用的go版本與git clone拉取下來的項(xiàng)目的go.mod所用的go版本不一致導(dǎo)致的: 在項(xiàng)目中打開一個(gè)terminal,查看當(dāng)前安裝的go版本是否與go.mod的第二行的聲明一致:如下圖

    2024年02月06日
    瀏覽(32)
  • Go 中 slice 的 In 功能實(shí)現(xiàn)探索

    Go 中 slice 的 In 功能實(shí)現(xiàn)探索

    之前在知乎看到一個(gè)問題:為什么 Golang 沒有像 Python 中 in 一樣的功能?于是,搜了下這個(gè)問題,發(fā)現(xiàn)還是有不少人有這樣的疑問。 補(bǔ)充:本文寫于 2019 年。GO 現(xiàn)在已經(jīng)支持泛型,而且新增了一個(gè) slices 包,已經(jīng)支持了 Contains 方法。 今天來談?wù)勥@個(gè)話題。 in 是一個(gè)很常用的

    2024年01月19日
    瀏覽(19)
  • Go 語言中高效切片拼接和 GO 1.22 提供的新方法

    Go 語言中高效切片拼接和 GO 1.22 提供的新方法

    在 Go 語言中,切片拼接是一項(xiàng)常見的操作,但如果處理不當(dāng),可能會(huì)導(dǎo)致性能問題或意外的副作用。 本文將詳細(xì)介紹幾種高效的切片拼接方法,包括它們的優(yōu)缺點(diǎn)以及適用場景。 在 Go 中,切片是一種動(dòng)態(tài)數(shù)組,常用于存儲(chǔ)和處理一系列相同類型的數(shù)據(jù)。 在實(shí)際應(yīng)用中,我

    2024年01月19日
    瀏覽(28)
  • 力扣日記1.21-【回溯算法篇】77. 組合

    力扣日記1.21-【回溯算法篇】77. 組合

    日期:2023.1.21 參考:代碼隨想錄、力扣 終于結(jié)束二叉樹了!聽說回溯篇也是個(gè)大頭,不知道這一篇得持續(xù)多久了…… 題目描述 難度:中等 給定兩個(gè)整數(shù) n 和 k,返回范圍 [1, n] 中所有可能的 k 個(gè)數(shù)的組合。 你可以按 任何順序 返回答案。 示例 1: 輸入:n = 4, k = 2 輸出:

    2024年01月22日
    瀏覽(22)
  • Golang學(xué)習(xí)——string和slice切片

    Golang學(xué)習(xí)——string和slice切片

    1個(gè)字節(jié)可以表示256個(gè)數(shù)字,2個(gè)字節(jié)可以表示65536個(gè)數(shù)字 字符集:字符編號對照表。收錄很多數(shù)字,給它們一一編號。 字符集的更迭 全球化統(tǒng)一標(biāo)準(zhǔn)——通用字符集 于1990年開始研發(fā)并于1994年正式公布,實(shí)現(xiàn)了跨語言跨平臺(tái)的文本轉(zhuǎn)換與處理。 字符集促成了字符與二進(jìn)制的

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包