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

泛型结构体封装切片方法

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

相关推荐
Serverless社区2 小时前
一键部署QwQ-32B推理模型,2种方式简单、快速体验
go
大鹏dapeng2 小时前
Gone V2 Provider 机制介绍
后端·go·github
Nathan__275 小时前
go-文件缓存与锁
缓存·go·
一个热爱生活的普通人5 小时前
如何用golang实现一个MCP Server
llm·go·mcp
江湖十年8 小时前
如何基于 Go 语言设计一个简洁优雅的分布式任务系统
分布式·后端·go
upsilon1 天前
golang切片slice
后端·go
upsilon1 天前
golang数组
后端·go
aricvvang1 天前
Go结构体优化(对齐方式)
后端·go
湫qiu1 天前
手写 Protobuf —— Java 代码生成
java·go·protobuf
侯大宝1 天前
开箱即用的go-zero示例
go·go-zero