泛型结构体封装切片方法
- 旨在封装切片的增、删、改、查、长度大小、ForEach(遍历切片)
- 采用指针接受者函数进行封装,修改其原切片数据
- 声明一个
SliceData
泛型结构体
go
type SliceData[T any] struct {
data []T
size int
}
上文 data
是切片的元素,size
表示切片的长度
Push 增
Push
方法用来增加切片的元素并返回增加完之后切片的长度
go
func (sd *SliceData[T]) Push (elements ...T) int {
sd.data = append (sd.data, elements...)
sd.size = len(sd.data)
return sd.size
}
- 使用
Push
go
package main
import "fmt"
type SliceData[T any] struct {
data []T
size int
}
func main() {
// 声明一个[]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
}
打印结果: 8 [1 2 3 4 5 6 7 8]
Remove 删
删除指定索引的元素并将该元素返回
go
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
go
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
}
打印结果: 1 [2 3] 2
Set 改
修改指定索引的值,返回两个值:原索引值和修改的值
go
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
go
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
}
打印结果:1 100 [100 2 3]
Get 查
获取并返回指定索引的值
go
func (sd *SliceData[T]) Get (index int) T {
return sd.data[index]
}
ForEach 遍历切片
ForEach
方法用来遍历切片。它接受一个回调函数,回调参数为:index(索引)
、element(元素)
、slice(切片)
,在回调函数内部执行你自己定义的逻辑。
go
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
go
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)
}
}
打印结果:
0 1 [1 2 3]
1 2 [1 2 3]
2 3 [1 2 3]
Map
Map
方法接受一个回调函数,参数同ForEach
方法。不同之处在于你可以对element
进行修改,它会返回一个新的切片。
go
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
}
打印结果:[2 3 4]
Size 获取长度大小
go
func (sd *SliceData[T]) Size () int {
return sd.size
}
GetSlice 获取切片元素
go
func (sd *SliceData[T]) GetSlice () []T {
return sd.data
}
本人是一个初学Go的小白,封装如有不对的地方,欢迎大神来指正。