go語言切片去重的3種方式
go語言中的切片是使用非常頻繁的一個數(shù)據結構,對于他的去重,我們可以有以下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ù)據,后面都使用append來動態(tài)增加并擴容
m1 := make(map[T]byte)
for _, v := range ss {
if _, ok := m1[v]; !ok { //如果數(shù)據不在map中,放入
m1[v] = 1 // 保存到map中,用于下次判斷
newSlices = append(newSlices, v) // 將數(shù)據放入新的切片中
}
}
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ù)據的key不能重復的特性,將切片的值當做key放入map中,達到去重的目的
m1 := make(map[T]byte)
for i := 0; i < size; i++ {
m1[ss[i]] = 1
}
// 創(chuàng)建一個切片,長度為去重后的數(shù)據長度
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
}總結
對于golang的切片去重,效率最高的方式為map+append函數(shù)的方式,因為他們的時間復雜度是最低的,對于go版本大于1.21的推薦使用泛型參數(shù)的切片去重,這樣一個函數(shù)就可以解決所有類型的切片去重問題,高效精簡!
到此這篇關于go語言切片去重的3種方式 的文章就介紹到這了,更多相關go語言切片去重內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談Go語言多態(tài)的實現(xiàn)與interface使用
如果大家系統(tǒng)的學過C++、Java等語言以及面向對象的話,相信應該對多態(tài)不會陌生。多態(tài)是面向對象范疇當中經常使用并且非常好用的一個功能,它主要是用在強類型語言當中,像是Python這樣的弱類型語言,變量的類型可以隨意變化,也沒有任何限制,其實區(qū)別不是很大2021-06-06
一文帶你了解Golang中select的實現(xiàn)原理
select是go提供的一種跟并發(fā)相關的語法,非常有用。本文將介紹?Go?語言中的?select?的實現(xiàn)原理,包括?select?的結構和常見問題、編譯期間的多種優(yōu)化以及運行時的執(zhí)行過程2023-02-02
Golang使用CGO與Plugin技術運行加載C動態(tài)庫
這篇文章主要介紹了Golang使用CGO與Plugin技術運行加載C動態(tài)庫,Golang?程序在運行時加載C動態(tài)庫的技術,跳過了Golang項目編譯階段需要鏈接C動態(tài)庫的過程,提高了Golang項目開發(fā)部署的靈活性2022-07-07

