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

go語(yǔ)言切片去重的3種方式

 更新時(shí)間:2024年08月19日 11:26:19   作者:tekin  
go語(yǔ)言中的切片是使用非常頻繁的一個(gè)數(shù)據(jù)結(jié)構(gòu),本文主要介紹了go語(yǔ)言切片去重的3種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

go語(yǔ)言中的切片是使用非常頻繁的一個(gè)數(shù)據(jù)結(jié)構(gòu),對(duì)于他的去重,我們可以有以下3種方式

1. 切片slice去重

利用map的key不能重復(fù)的特性+append函數(shù)  一次for循環(huán)搞定

這個(gè)模式時(shí)間復(fù)雜度最低,效率最高, 如果go版本大于1.21推薦使用這種方式的泛型參數(shù)版本

// 改進(jìn)版的slice去重
func UniqueSliceInt64(ss []int64) []int64 {
	newSS := make([]int64, 0)  // 返回的新切片
	m1 := make(map[int64]byte) //用來(lái)去重的臨時(shí)map
	for _, v := range ss {
		if _, ok := m1[v]; !ok {
			m1[v] = 1
			newSS = append(newSS, v)
		}
	}
	return newSS
}

泛型參數(shù)版本,需要go版本大于1.21 否則不能使用泛型參數(shù)

// 切片去重升級(jí)版 泛型參數(shù) 利用map的key不能重復(fù)的特性+append函數(shù)  一次for循環(huán)搞定
func Unique[T cmp.Ordered](ss []T) []T {
	size := len(ss)
	if size == 0 {
		return []T{}
	}
	newSlices := make([]T, 0) //這里新建一個(gè)切片,大于為0, 因?yàn)槲覀儾恢烙袔讉€(gè)非重復(fù)數(shù)據(jù),后面都使用append來(lái)動(dòng)態(tài)增加并擴(kuò)容
	m1 := make(map[T]byte)
	for _, v := range ss {
		if _, ok := m1[v]; !ok { //如果數(shù)據(jù)不在map中,放入
			m1[v] = 1                        // 保存到map中,用于下次判斷
			newSlices = append(newSlices, v) // 將數(shù)據(jù)放入新的切片中
		}
	}
	return newSlices
}

2. 切片去重

利用map的key不能重復(fù)的特性 2次for循環(huán)

下面這個(gè)使用了泛型參數(shù)

//go版本大于1.21的情況,可以使用泛型參數(shù)

// 切片去重  泛型參數(shù) 利用map的key不能重復(fù)的特性 2次for循環(huán)
func Unique1[T cmp.Ordered](ss []T) []T {
	size := len(ss)
	if size == 0 {
		return []T{}
	}
	// 這個(gè)地方利用了map數(shù)據(jù)的key不能重復(fù)的特性,將切片的值當(dāng)做key放入map中,達(dá)到去重的目的
	m1 := make(map[T]byte)
	for i := 0; i < size; i++ {
		m1[ss[i]] = 1
	}
	// 創(chuàng)建一個(gè)切片,長(zhǎng)度為去重后的數(shù)據(jù)長(zhǎng)度
	newSS := make([]T, len(m1))
	idx := 0
	for key := range m1 { // 循環(huán)map, 將key放入到切片中
		newSS[idx] = key
		idx++
	}
	return newSS
}

cmp.Ordered泛型參數(shù)約束接口參考    注意上面的泛型參數(shù)約束 cmp.Ordered 是一個(gè)專(zhuān)門(mén)用于泛型類(lèi)型約束的接口定義, 需要go版本大于1.21才能使用

type Ordered interface {
    ~int | ~int8 | ~int16 | ~int32 | ~int64 |
        ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
        ~float32 | ~float64 |
        ~string
}

3. 切片去重

雙層for循環(huán)模式

這種方式方式直觀,但是時(shí)間復(fù)雜度較高!

// 切片去重 雙層for循環(huán)模式
func Unique0(ss []int64) (newSS []int64) {
	newSS = make([]int64, 0)
	for i := 0; i < len(ss); i++ {
		repeat := false
		for j := i + 1; j < len(ss); j++ {
			if ss[i] == ss[j] {
				repeat = true
				break
			}
		}
		if !repeat {
			newSS = append(newSS, ss[i])
		}
	}
	return
}

總結(jié)

對(duì)于golang的切片去重,效率最高的方式為map+append函數(shù)的方式,因?yàn)樗麄兊臅r(shí)間復(fù)雜度是最低的,對(duì)于go版本大于1.21的推薦使用泛型參數(shù)的切片去重,這樣一個(gè)函數(shù)就可以解決所有類(lèi)型的切片去重問(wèn)題,高效精簡(jiǎn)! 

到此這篇關(guān)于go語(yǔ)言切片去重的3種方式 的文章就介紹到這了,更多相關(guān)go語(yǔ)言切片去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go?語(yǔ)言垃圾回收機(jī)制從入門(mén)到理解

    Go?語(yǔ)言垃圾回收機(jī)制從入門(mén)到理解

    本文主要介紹了Go?語(yǔ)言垃圾回收機(jī)制從入門(mén)到理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • golang使用通道時(shí)需要注意的一些問(wèn)題

    golang使用通道時(shí)需要注意的一些問(wèn)題

    本文主要介紹了golang使用通道時(shí)需要注意的一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Go語(yǔ)言服務(wù)器開(kāi)發(fā)實(shí)現(xiàn)最簡(jiǎn)單HTTP的GET與POST接口

    Go語(yǔ)言服務(wù)器開(kāi)發(fā)實(shí)現(xiàn)最簡(jiǎn)單HTTP的GET與POST接口

    這篇文章主要介紹了Go語(yǔ)言服務(wù)器開(kāi)發(fā)實(shí)現(xiàn)最簡(jiǎn)單HTTP的GET與POST接口,實(shí)例分析了Go語(yǔ)言http包的使用技巧,需要的朋友可以參考下
    2015-02-02
  • Go語(yǔ)言刪除文本文件中的指定行操作代碼

    Go語(yǔ)言刪除文本文件中的指定行操作代碼

    假設(shè)現(xiàn)在有一個(gè)文本文件,我們需要?jiǎng)h除文件中亂碼的行。我們可以使用go的os庫(kù)來(lái)處理文件,遍歷整個(gè)文件然后將除過(guò)亂碼的行寫(xiě)入一個(gè)新文件,以此來(lái)實(shí)現(xiàn)我們的需求,這篇文章主要介紹了Go語(yǔ)言刪除文本文件中的指定行,需要的朋友可以參考下
    2023-12-12
  • Go語(yǔ)言執(zhí)行cmd命令庫(kù)的方法實(shí)現(xiàn)

    Go語(yǔ)言執(zhí)行cmd命令庫(kù)的方法實(shí)現(xiàn)

    go語(yǔ)言用來(lái)執(zhí)行一個(gè)系統(tǒng)的命令相對(duì)python來(lái)說(shuō)還是有點(diǎn)復(fù)雜的,執(zhí)行命令是一個(gè)非常常見(jiàn)的需求,本文主要介紹了Go語(yǔ)言執(zhí)行cmd命令庫(kù)的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • golang利用pprof與go-torch如何做性能分析

    golang利用pprof與go-torch如何做性能分析

    這篇文章主要給大家介紹了關(guān)于golang利用pprof與go-torch如何做性能分析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Go語(yǔ)言中命令行參數(shù)解析工具pflag的使用指南

    Go語(yǔ)言中命令行參數(shù)解析工具pflag的使用指南

    在使用?Go?進(jìn)行開(kāi)發(fā)的過(guò)程中,命令行參數(shù)解析是我們經(jīng)常遇到的需求,于是?Go?社區(qū)中出現(xiàn)了一個(gè)叫?pflag?的第三方包,功能更加全面且足夠強(qiáng)大,下面我們就來(lái)看看它的具體使用吧
    2024-11-11
  • go?zero微服務(wù)實(shí)戰(zhàn)系服務(wù)拆分

    go?zero微服務(wù)實(shí)戰(zhàn)系服務(wù)拆分

    這篇文章主要為大家介紹了go?zero微服務(wù)實(shí)戰(zhàn)系服務(wù)拆分的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 基于go interface{}==nil 的幾種坑及原理分析

    基于go interface{}==nil 的幾種坑及原理分析

    這篇文章主要介紹了基于go interface{}==nil 的幾種坑及原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • golang使用go mod導(dǎo)入本地包和第三方包的方式

    golang使用go mod導(dǎo)入本地包和第三方包的方式

    這篇文章主要介紹了golang使用go mod導(dǎo)入本地包和第三方包的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

定西市| 杭锦后旗| 清远市| 宁城县| 吉木萨尔县| 龙川县| 浪卡子县| 德江县| 稻城县| 宁明县| 巴南区| 三亚市| 大同市| 凤山县| 恩施市| 军事| 塔河县| 启东市| 彭山县| 长阳| 武山县| 陆丰市| 达孜县| 鸡西市| 呼和浩特市| 庆元县| 尼木县| 孝义市| 乐亭县| 娄底市| 怀远县| 清涧县| 禹城市| 章丘市| 南涧| 临泽县| 阜平县| 科技| 米脂县| 乌拉特后旗| 冀州市|