golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片
泛型結(jié)構(gòu)體封裝切片方法
- 旨在封裝切片的增、刪、改、查、長度大小、ForEach(遍歷切片)
- 采用指針接受者函數(shù)進(jìn)行封裝,修改其原切片數(shù)據(jù)
- 聲明一個(gè)
SliceData
泛型結(jié)構(gòu)體
type SliceData[T any] struct { data []T size int }
上文 data
是切片的元素,size
表示切片的長度
Push 增
Push
方法用來增加切片的元素并返回增加完之后切片的長度
func (sd *SliceData[T]) Push (elements ...T) int { sd.data = append (sd.data, elements...) sd.size = len(sd.data) return sd.size }
使用Push
package main import "fmt" type SliceData[T any] struct { data []T size int } func main() { // 聲明一個(gè)[]int切片 sliceData := SliceData[int]{ data: []int{1, 2, 3, 4}, size: 4, } // 使用Push方法增加元素 index := sliceData.Push(5, 6, 7, 8) fmt.Println(index, sliceData.data)// 8 [1 2 3 4 5 6 7 8] } func (sd *SliceData[T]) Push(elements ...T) int { sd.data = append(sd.data, elements...) sd.size = len(sd.data) return sd.size }
打印結(jié)果:
8 [1 2 3 4 5 6 7 8]
Remove 刪
刪除指定索引的元素并將該元素返回
func (sd *SliceData[T]) Remove(index int) T { element := sd.data[index] sd.data = append (sd.data[:index], sd.data[index+1:]...) sd.size -= 1 return element }
使用Remove
package main import "fmt" type SliceData[T any] struct { data []T size int } func main() { sliceData := SliceData[int]{ data: []int{1, 2, 3}, size: 3, } // 刪除第0位元素 element := sliceData.Remove(0) fmt.Println(element, sliceData.data, sliceData.size) // 1 [2 3] 2 } func (sd *SliceData[T]) Remove(index int) T { element := sd.data[index] sd.data = append(sd.data[:index], sd.data[index+1:]...) sd.size -= 1 return element }
打印結(jié)果:
1 [2 3] 2
Set 改
修改指定索引的值,返回兩個(gè)值:原索引值和修改的值
func (sd *SliceData[T]) Set (index int, element T) (oldValue, newValue T) { oldValue = sd.data[index] newValue = element sd.data[index] = element return oldValue, newValue }
使用:Set
package main import "fmt" type SliceData[T any] struct { data []T size int } func main() { sliceData := SliceData[int]{ data: []int{1, 2, 3}, size: 3, } newValue, oldValue := sliceData.Set(0, 100) fmt.Println(newValue, oldValue, sliceData.data) // 1 100 [100 2 3] } func (sd *SliceData[T]) Set(index int, element T) (oldValue, newValue T) { oldValue = sd.data[index] newValue = element sd.data[index] = element return oldValue, newValue }
打印結(jié)果:
1 100 [100 2 3]
Get 查
獲取并返回指定索引的值
func (sd *SliceData[T]) Get (index int) T { return sd.data[index] }
ForEach 遍歷切片
ForEach
方法用來遍歷切片。它接受一個(gè)回調(diào)函數(shù),回調(diào)參數(shù)為:index(索引)
、element(元素)
、slice(切片)
,在回調(diào)函數(shù)內(nèi)部執(zhí)行你自己定義的邏輯。
func (sd *SliceData[T]) ForEach (cb func ( index int, element T, slice []T, )) T { for index, element := range sd.data { cb (index, element, sd.data) } }
使用:ForEach
package main import "fmt" type SliceData[T any] struct { data []T size int } func main() { sliceData := SliceData[int]{ data: []int{1, 2, 3}, size: 3, } sliceData.ForEach(func(index int, element int, slice []int) { fmt.Println(index, element, slice) }) } func (sd *SliceData[T]) ForEach(cb func( index int, element T, slice []T, )) { for index, element := range sd.data { cb(index, element, sd.data) } }
打印結(jié)果:
0 1 [1 2 3]
1 2 [1 2 3]
2 3 [1 2 3]
Map
Map
方法接受一個(gè)回調(diào)函數(shù),參數(shù)同ForEach
方法。不同之處在于你可以對element
進(jìn)行修改,它會(huì)返回一個(gè)新的切片。
package main import "fmt" type SliceData[T any] struct { data []T size int } func main() { sliceData := SliceData[int]{ data: []int{1, 2, 3}, size: 3, } newSlice := sliceData.Map(func(index int, element int, slice []int) int { element += 1 return element }) fmt.Println(newSlice) } func (sd *SliceData[T]) Map(cb func( index int, element T, slice []T, ) T) []T { newSlice := make([]T, 0) for index, element := range sd.data { element = cb(index, element, sd.data) newSlice = append(newSlice, element) } return newSlice }
打印結(jié)果:
[2 3 4]
Size 獲取長度大小
func (sd *SliceData[T]) Size () int { return sd.size }
GetSlice 獲取切片元素
func (sd *SliceData[T]) GetSlice () []T { return sd.data }
以上就是golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片的詳細(xì)內(nèi)容,更多關(guān)于go封裝切片的資料請關(guān)注腳本之家其它相關(guān)文章!
- go語言中結(jié)構(gòu)體tag使用小結(jié)
- Golang?中判斷兩個(gè)結(jié)構(gòu)體相等的方法
- Go語言中結(jié)構(gòu)體的高級技巧分享
- Go中匿名結(jié)構(gòu)體的使用技巧
- 詳解Golang time包中的結(jié)構(gòu)體time.Ticker
- 詳解Golang time包中的結(jié)構(gòu)體time.Time
- 詳解Go語言中的結(jié)構(gòu)體的特性
- 一文帶你感受Go語言空結(jié)構(gòu)體的魔力
- 細(xì)說Go語言中空結(jié)構(gòu)體的奇妙用途
- 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
- 深入理解Go語言中的結(jié)構(gòu)體
相關(guān)文章
Go語言實(shí)現(xiàn)IP段范圍校驗(yàn)示例
這篇文章主要介紹了Go語言實(shí)現(xiàn)IP段范圍校驗(yàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09golang 數(shù)組隨機(jī)排序的實(shí)現(xiàn)
本文主要介紹了golang 數(shù)組隨機(jī)排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12golang channel讀取數(shù)據(jù)的幾種情況
本文主要介紹了golang channel讀取數(shù)據(jù)的幾種情況,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02詳解Go語言如何利用上下文進(jìn)行并發(fā)計(jì)算
在Go編程中,上下文(context)是一個(gè)非常重要的概念,它包含了與請求相關(guān)的信息,本文主要來和大家討論一下如何在并發(fā)計(jì)算中使用上下文,感興趣的可以了解下2024-02-02