欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語言切片去重的3種方式

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

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

1. 切片slice去重

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

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

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

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

// 切片去重升級版 泛型參數(shù) 利用map的key不能重復的特性+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) //這里新建一個切片,大于為0, 因為我們不知道有幾個非重復數(shù)據(jù),后面都使用append來動態(tài)增加并擴容
	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不能重復的特性 2次for循環(huán)

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

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

// 切片去重  泛型參數(shù) 利用map的key不能重復的特性 2次for循環(huán)
func Unique1[T cmp.Ordered](ss []T) []T {
	size := len(ss)
	if size == 0 {
		return []T{}
	}
	// 這個地方利用了map數(shù)據(jù)的key不能重復的特性,將切片的值當做key放入map中,達到去重的目的
	m1 := make(map[T]byte)
	for i := 0; i < size; i++ {
		m1[ss[i]] = 1
	}
	// 創(chuàng)建一個切片,長度為去重后的數(shù)據(jù)長度
	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 是一個專門用于泛型類型約束的接口定義, 需要go版本大于1.21才能使用

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

3. 切片去重

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

這種方式方式直觀,但是時間復雜度較高!

// 切片去重 雙層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é)

對于golang的切片去重,效率最高的方式為map+append函數(shù)的方式,因為他們的時間復雜度是最低的,對于go版本大于1.21的推薦使用泛型參數(shù)的切片去重,這樣一個函數(shù)就可以解決所有類型的切片去重問題,高效精簡! 

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

相關(guān)文章

  • 淺談Go語言多態(tài)的實現(xiàn)與interface使用

    淺談Go語言多態(tài)的實現(xiàn)與interface使用

    如果大家系統(tǒng)的學過C++、Java等語言以及面向?qū)ο蟮脑?,相信應該對多態(tài)不會陌生。多態(tài)是面向?qū)ο蠓懂牣斨薪?jīng)常使用并且非常好用的一個功能,它主要是用在強類型語言當中,像是Python這樣的弱類型語言,變量的類型可以隨意變化,也沒有任何限制,其實區(qū)別不是很大
    2021-06-06
  • 淺談golang 中time.After釋放的問題

    淺談golang 中time.After釋放的問題

    這篇文章主要介紹了淺談golang 中time.After釋放的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go日志框架zap增強及源碼解讀

    Go日志框架zap增強及源碼解讀

    這篇文章主要為大家介紹了Go日志框架zap增強及源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Golang實現(xiàn)單鏈表的示例代碼

    Golang實現(xiàn)單鏈表的示例代碼

    本文主要介紹了Golang實現(xiàn)單鏈表的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 一文帶你了解Golang中select的實現(xiàn)原理

    一文帶你了解Golang中select的實現(xiàn)原理

    select是go提供的一種跟并發(fā)相關(guān)的語法,非常有用。本文將介紹?Go?語言中的?select?的實現(xiàn)原理,包括?select?的結(jié)構(gòu)和常見問題、編譯期間的多種優(yōu)化以及運行時的執(zhí)行過程
    2023-02-02
  • Golang使用CGO與Plugin技術(shù)運行加載C動態(tài)庫

    Golang使用CGO與Plugin技術(shù)運行加載C動態(tài)庫

    這篇文章主要介紹了Golang使用CGO與Plugin技術(shù)運行加載C動態(tài)庫,Golang?程序在運行時加載C動態(tài)庫的技術(shù),跳過了Golang項目編譯階段需要鏈接C動態(tài)庫的過程,提高了Golang項目開發(fā)部署的靈活性
    2022-07-07
  • 讓go程序以后臺進程或daemon方式運行方法探究

    讓go程序以后臺進程或daemon方式運行方法探究

    本文探討了如何通過Go代碼實現(xiàn)在后臺運行的程序,最近我用Go語言開發(fā)了一個WebSocket服務,我希望它能在后臺運行,并在異常退出時自動重新啟動,我的整體思路是將程序轉(zhuǎn)為后臺進程,也就是守護進程(daemon)
    2024-01-01
  • 詳解Golang中Channel的原理和使用技巧

    詳解Golang中Channel的原理和使用技巧

    Channel管道提供了一種機制,它在兩個并發(fā)執(zhí)行的協(xié)程之間進行同步,并通過傳遞與該管道元素類型相符的值來進行通信。本文主要介紹了Channel的原理和使用技巧,需要的可以參考一下
    2022-11-11
  • go語言字符串的拼接和切片方法總結(jié)

    go語言字符串的拼接和切片方法總結(jié)

    在go語言中,因為字符串只能被訪問,不能被修改,所以進行字符串拼接的時候,golang都需要進行內(nèi)存拷貝,造成一定的性能消耗,這篇文章主要給大家介紹了關(guān)于go語言字符串的拼接和切片的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Go語言實現(xiàn)socket實例

    Go語言實現(xiàn)socket實例

    這篇文章主要介紹了Go語言實現(xiàn)socket的方法,實例分析了socket客戶端與服務器端的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02

最新評論