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

泛型结构体封装切片方法

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

相关推荐
蒙娜丽宁2 天前
Go语言错误处理详解
ios·golang·go·xcode·go1.19
qq_172805593 天前
GO Govaluate
开发语言·后端·golang·go
littleschemer3 天前
Go缓存系统
缓存·go·cache·bigcache
程序者王大川4 天前
【GO开发】MacOS上搭建GO的基础环境-Hello World
开发语言·后端·macos·golang·go
Grassto4 天前
Gitlab 中几种不同的认证机制(Access Tokens,SSH Keys,Deploy Tokens,Deploy Keys)
go·ssh·gitlab·ci
高兴的才哥5 天前
kubevpn 教程
kubernetes·go·开发工具·telepresence·bridge to k8s
少林码僧6 天前
sqlx1.3.4版本的问题
go
蒙娜丽宁6 天前
Go语言结构体和元组全面解析
开发语言·后端·golang·go
蒙娜丽宁6 天前
深入解析Go语言的类型方法、接口与反射
java·开发语言·golang·go
三里清风_6 天前
Docker概述
运维·docker·容器·go