最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片

 更新時(shí)間:2023年10月30日 10:22:27   作者:Sun_學(xué)徒  
這篇文章主要為大家詳細(xì)介紹了golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片,即封裝切片的增、刪、改、查、長度大小、ForEach(遍歷切片),感興趣的小伙伴可以學(xué)習(xí)一下

泛型結(jié)構(gòu)體封裝切片方法

  • 旨在封裝切片的增、刪、改、查、長度大小、ForEach(遍歷切片)
  • 采用指針接受者函數(shù)進(jìn)行封裝,修改其原切片數(shù)據(jù)
  • 聲明一個(gè)SliceData泛型結(jié)構(gòu)體
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() {
    // 聲明一個(gè)[]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
}

打印結(jié)果:

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
}

打印結(jié)果:

1 [2 3] 2

Set 改

修改指定索引的值,返回兩個(gè)值:原索引值和修改的值

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
}

打印結(jié)果:

1 100 [100 2 3]

Get 查

獲取并返回指定索引的值

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

ForEach 遍歷切片

ForEach方法用來遍歷切片。它接受一個(gè)回調(diào)函數(shù),回調(diào)參數(shù)為:index(索引)element(元素)、slice(切片),在回調(diào)函數(shù)內(nèi)部執(zhí)行你自己定義的邏輯。

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

打印結(jié)果:

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

Map

Map方法接受一個(gè)回調(diào)函數(shù),參數(shù)同ForEach方法。不同之處在于你可以對element進(jìn)行修改,它會(huì)返回一個(gè)新的切片。

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
}

打印結(jié)果:

[2 3 4]

Size 獲取長度大小

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

GetSlice 獲取切片元素

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

以上就是golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片的詳細(xì)內(nèi)容,更多關(guān)于go封裝切片的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Go語言中for range的

    詳解Go語言中for range的"坑"

    這篇文章主要介紹了詳解Go語言中for range的"坑",文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項(xiàng)目實(shí)踐

    Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項(xiàng)目實(shí)踐

    本文主要介紹了Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go設(shè)置http請求超時(shí)的方法實(shí)現(xiàn)

    Go設(shè)置http請求超時(shí)的方法實(shí)現(xiàn)

    這篇文章主要介紹了Go設(shè)置http請求超時(shí)的方法實(shí)現(xiàn),最近接手了一個(gè)老項(xiàng)目進(jìn)行維護(hù),發(fā)現(xiàn)其中有個(gè)關(guān)于 http 請求的方法設(shè)置的 timeout 沒有生效,很奇怪,一開始查看代碼并沒有發(fā)現(xiàn)什么可疑點(diǎn),后查看了源碼,打斷點(diǎn)調(diào)試才發(fā)現(xiàn)問題所在,這里簡單記錄復(fù)盤一下
    2024-08-08
  • go 語言字符類型 byte 與 rune案例詳解

    go 語言字符類型 byte 與 rune案例詳解

    這篇文章主要介紹了go 語言字符類型 byte 與 rune案例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 掌握Golang中的select語句實(shí)現(xiàn)并發(fā)編程

    掌握Golang中的select語句實(shí)現(xiàn)并發(fā)編程

    Golang中的select語句用于在多個(gè)通道間選擇可讀或可寫的操作,并阻塞等待其中一個(gè)通道進(jìn)行操作??梢杂糜趯?shí)現(xiàn)超時(shí)控制、取消和中斷操作等。同時(shí),select語句支持default分支,用于在沒有任何通道可操作時(shí)執(zhí)行默認(rèn)操作
    2023-04-04
  • Go日志之日志庫講解

    Go日志之日志庫講解

    本文介紹了Go語言中最優(yōu)秀的日志庫,包括Zap、log/slog、Logrus和Zerolog,它們都提供了結(jié)構(gòu)化日志記錄、自定義日志級(jí)別、輸出目標(biāo)等特性,感興趣的可以了解一下
    2026-04-04
  • Go 并發(fā)實(shí)現(xiàn)協(xié)程同步的多種解決方法

    Go 并發(fā)實(shí)現(xiàn)協(xié)程同步的多種解決方法

    這篇文章主要介紹了Go 并發(fā)——實(shí)現(xiàn)協(xié)程同步的多種解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • 如何在 ubuntu linux 上配置 go 語言的 qt 開發(fā)環(huán)境

    如何在 ubuntu linux 上配置 go 語言的 qt 開發(fā)環(huán)境

    這篇文章主要介紹了如何在 ubuntu linux 上配置 go 語言的 qt 開發(fā)環(huán)境,本文分步驟通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Golang Gin框架中間件的用法詳解

    Golang Gin框架中間件的用法詳解

    中間件是Gin框架中的一個(gè)核心概念,它允許開發(fā)者在處理HTTP請求的過程中插入自定義的鉤子函數(shù),從而實(shí)現(xiàn)諸如日志記錄、身份驗(yàn)證、權(quán)限控制等公共邏輯,本文將結(jié)合實(shí)際案例,詳細(xì)講解Gin框架中間件的用法
    2024-10-10
  • 一文帶你掌握Go語言I/O操作中的io.Reader和io.Writer

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

    在?Go?語言中,io.Reader?和?io.Writer?是兩個(gè)非常重要的接口,它們在許多標(biāo)準(zhǔn)庫中都扮演著關(guān)鍵角色,下面就跟隨小編一起學(xué)習(xí)一下它們的使用吧
    2025-01-01

最新評論

上思县| 沙雅县| 门头沟区| 敦化市| 嘉黎县| 得荣县| 阿拉尔市| 游戏| 如皋市| 绥棱县| 柏乡县| 吐鲁番市| 文水县| 林周县| 宁德市| 灵寿县| 南澳县| 霍林郭勒市| 平江县| 五台县| 仁化县| 中卫市| 固镇县| 盐山县| 荆州市| 吴忠市| 和林格尔县| 惠水县| 襄垣县| 孙吴县| 巨野县| 桂林市| 安新县| 辽源市| 利辛县| 镇雄县| 偏关县| 山东| 闸北区| 云南省| 额敏县|