使用泛型结构体封装切片方法

泛型结构体封装切片方法

  • 旨在封装切片的增、删、改、查、长度大小、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的小白,封装如有不对的地方,欢迎大神来指正。

相关推荐
我的div丢了肿么办8 小时前
go语言中的map,map定义不同的数据类型,循环map,map的无序性
后端·go
名字还没想好☜14 小时前
Go 1.21 context.WithoutCancel 实战:父 context 取消了,收尾任务还要继续跑
开发语言·后端·golang·go
newerp14 小时前
Golang 接口的两副面孔:eface、iface 与动态派发之谜
后端·程序员·go
明月_清风15 小时前
递归算法:从原理到实战,一次讲透
后端·算法·go
运维开发笔记16 小时前
9.1 Go Interface 基础知识学习笔记
go
a1879272183116 小时前
【算法】回溯算法(一):从一道 IP 题到万能模板
算法·leetcode·go·回溯·leetcode93·ip复原·算法讲解
名字还没想好☜17 小时前
Go 用 -race 抓数据竞争:一个偶发崩溃的排查、原理与修复
开发语言·后端·golang·go
Vespeng1 天前
打破传统 MVC:在 Go 中实践高内聚的业务驱动架构
架构·go·gin
用户029669769821 天前
摸着石头过河:我用Go把微信加密模块给逆向了一回
微信·go
idcu2 天前
CodeSchema 开源首发:一个给 AI 编码助手「喂」精准代码上下文的索引服务
开源·go·ai编程