golang使用泛型结构体实现封装切片

 更新时间:2023年10月30日 10:22:27   作者:Sun_学徒  
这篇文章主要为大家详细介绍了golang使用泛型结构体实现封装切片,即封装切片的增、删、改、查、长度大小、ForEach(遍历切片),感兴趣的小伙伴可以学习一下

泛型结构体封装切片方法

  • 旨在封装切片的增、删、改、查、长度大小、ForEach(遍历切片)
  • 采用指针接受者函数进行封装,修改其原切片数据
  • 声明一个SliceData泛型结构体
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() {
    // 声明一个[]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 删

删除指定索引的元素并将该元素返回

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
}

打印结果:

1 [2 3] 2

Set 改

修改指定索引的值,返回两个值:原索引值和修改的值

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
}

打印结果:

1 100 [100 2 3]

Get 查

获取并返回指定索引的值

func (sd *SliceData[T]) Get (index int) T {
    return sd.data[index]
}

ForEach 遍历切片

ForEach方法用来遍历切片。它接受一个回调函数,回调参数为:index(索引)element(元素)slice(切片),在回调函数内部执行你自己定义的逻辑。

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)
    }
}

打印结果:

0 1 [1 2 3]
1 2 [1 2 3]
2 3 [1 2 3]

Map

Map方法接受一个回调函数,参数同ForEach方法。不同之处在于你可以对element进行修改,它会返回一个新的切片。

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 获取长度大小

func (sd *SliceData[T]) Size () int {
    return sd.size
}

GetSlice 获取切片元素

func (sd *SliceData[T]) GetSlice () []T {
    return sd.data
}

以上就是golang使用泛型结构体实现封装切片的详细内容,更多关于go封装切片的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Go语言中for range的

    详解Go语言中for range的"坑"

    这篇文章主要介绍了详解Go语言中for range的"坑",文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Golang并发读取文件数据并写入数据库的项目实践

    Golang并发读取文件数据并写入数据库的项目实践

    本文主要介绍了Golang并发读取文件数据并写入数据库的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Go设置http请求超时的方法实现

    Go设置http请求超时的方法实现

    这篇文章主要介绍了Go设置http请求超时的方法实现,最近接手了一个老项目进行维护,发现其中有个关于 http 请求的方法设置的 timeout 没有生效,很奇怪,一开始查看代码并没有发现什么可疑点,后查看了源码,打断点调试才发现问题所在,这里简单记录复盘一下
    2024-08-08
  • go 语言字符类型 byte 与 rune案例详解

    go 语言字符类型 byte 与 rune案例详解

    这篇文章主要介绍了go 语言字符类型 byte 与 rune案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 掌握Golang中的select语句实现并发编程

    掌握Golang中的select语句实现并发编程

    Golang中的select语句用于在多个通道间选择可读或可写的操作,并阻塞等待其中一个通道进行操作。可以用于实现超时控制、取消和中断操作等。同时,select语句支持default分支,用于在没有任何通道可操作时执行默认操作
    2023-04-04
  • Go日志之日志库讲解

    Go日志之日志库讲解

    本文介绍了Go语言中最优秀的日志库,包括Zap、log/slog、Logrus和Zerolog,它们都提供了结构化日志记录、自定义日志级别、输出目标等特性,感兴趣的可以了解一下
    2026-04-04
  • Go 并发实现协程同步的多种解决方法

    Go 并发实现协程同步的多种解决方法

    这篇文章主要介绍了Go 并发——实现协程同步的多种解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • 如何在 ubuntu linux 上配置 go 语言的 qt 开发环境

    如何在 ubuntu linux 上配置 go 语言的 qt 开发环境

    这篇文章主要介绍了如何在 ubuntu linux 上配置 go 语言的 qt 开发环境,本文分步骤通过实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • Golang Gin框架中间件的用法详解

    Golang Gin框架中间件的用法详解

    中间件是Gin框架中的一个核心概念,它允许开发者在处理HTTP请求的过程中插入自定义的钩子函数,从而实现诸如日志记录、身份验证、权限控制等公共逻辑,本文将结合实际案例,详细讲解Gin框架中间件的用法
    2024-10-10
  • 一文带你掌握Go语言I/O操作中的io.Reader和io.Writer

    一文带你掌握Go语言I/O操作中的io.Reader和io.Writer

    在 Go 语言中,io.Reader 和 io.Writer 是两个非常重要的接口,它们在许多标准库中都扮演着关键角色,下面就跟随小编一起学习一下它们的使用吧
    2025-01-01

最新评论