首页 > 编程语言 >golang 范型编程初学

golang 范型编程初学

时间:2022-12-20 18:11:19浏览次数:39  
标签:范型 Count batch golang Array 初学 func array any

 

写了一个批次执行函数的功能,采用范型,直接上代码

 

batch实现代码:

package utils

import (
	"time"
)

type batch[T any] struct {
	Array    []T
	Func     func(array []T)
	Count    int
	Interval float32
}

func (b *batch[T]) do() {
	arrayArray := b.sliceFun(b.Array, b.Count)
	for _, array := range arrayArray {
		b.Func(array)
		time.Sleep(time.Second * time.Duration(b.Interval))
	}
}

func (b *batch[T]) sliceFun(array []T, Count int) [][]T {
	if len(array) <= Count {
		return [][]T{array}
	}

	var arrayArray [][]T
	leftArray := array
	for len(leftArray) > 0 {
		if len(leftArray) > Count {
			arrayArray = append(arrayArray, leftArray[0:Count])
			leftArray = leftArray[Count:]
		} else {
			arrayArray = append(arrayArray, leftArray)
			leftArray = make([]T, 0)
		}
	}
	return arrayArray
}

type BatchOption[T any] func(*batch[T])

func SetBatchCount[T any](count int) BatchOption[T] {
	return func(b *batch[T]) {
		b.Count = count
	}
}

func SetBatchInterval[T any](interval float32) BatchOption[T] {
	return func(b *batch[T]) {
		b.Interval = interval
	}
}

func Batch[T any](
	Array []T,
	Func func(array []T),
	options ...BatchOption[T]) {

	b := &batch[T]{Array: Array, Func: Func}
	for _, o := range options {
		o(b)
	}

	if b.Count == 0 {
		b.Count = 500
	}
	if b.Interval == 0 {
		b.Interval = 0.1
	}

	b.do()
}

batch的调用方法是这样的:

	utils.Batch(adds, func(array []*authInterface.FactoryUser) {
		fmt.Printf("authUsers::OwnAllFactory batch: num:%d \n", len(array))
		addRes := (&authInterface.AddFactoryUserReq{
			Client: p.ErpClient,
			Array:  adds}).Request()
		if addRes.Code != web.SuccessJsonRes.Code {
			panic("error")
		}
	})

 

 

范型编程需要定义类型,直接any是没有范型的,曾经是这么以为。

红色的是类型参数范型函数的定义是采用中括号来定义:func Batch[T any](Array []T)

如果这样定义:func Batch(Array []any),那么仅仅是把any替换了interface{},填参数的时候需要转换,不然会提示类型不匹配

范型调用的时候不需要特殊处理,直接传参数就行。

 

标签:范型,Count,batch,golang,Array,初学,func,array,any
From: https://www.cnblogs.com/zhanchenjin/p/16994817.html

相关文章

  • 区块链,中心去,何曾着眼看君王?用Go语言实现区块链技术,通过Golang秒懂区块链
    区块链技术并不是什么高级概念,它并不比量子力学、泡利不相容原则、哥德巴赫猜想更难以理解,但却也不是什么类似“时间就是金钱”这种妇孺皆知的浅显道理。区块链其实是一套......
  • Golang glog使用详解
    ​​golang/glog​​​ 是C++版本 ​​google/glog​​ 的Go版本实现,基本实现了原生glog的日志格式。在Kuberntes中,glog是默认日志库。glog的使用与特性通用功......
  • Go-16 Golang语言time时间统计
    packagemain//time时间统计import( "fmt" "log" "time")funcmain(){ println() now_t:=time.Now() fmt.Printf("currentnowtime:%v\n",now_t) t......
  • Golang 语言开发规范(JD)
    Go语言开发规范指南本规范制定主要用于开发及代码review时进行参考,保证平台开发的一致性与规范性。1命名规范命名的规范性包括普通变量、结构体、指针类型等。1.1普通变量......
  • golang---进程、线程、goroutine
    创建进程os包及其子包os/exec提供了创建进程的方法。一般的,应该优先使用os/exec包。因为os/exec包依赖os包中关键创建进程的API,为了便于理解,我们先探讨os包中和......
  • Golang 环境搭建
    简述『Golang』(Go语言,以下简称Go)是Google开发的一种编译型、可并行化、并具有垃圾回收功能的编程语言。罗布·派克(RobPike)、罗伯特·格瑞史莫(RobertGriesemer)、及肯·......
  • golang标准库的排序算法---sort包(转载)
    sort——排序算法该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。但是这四种排序方法是不公开的,它们只被用于sort包内部使用。所以在对数据集合排......
  • golang标准库---container — 容器数据类型:heap、list 和 ring
    该包实现了三个复杂的数据结构:堆,链表,环。这个包就意味着你使用这三个数据结构的时候不需要再费心从头开始写算法了。3.3.1堆这里的堆使用的数据结构是最小二叉树,即根节点......
  • golang标准库---regexp — 正则表达式
    基础知识简单匹配你想知道一个字符串和一个正则表达式是否匹配。如果字符串参数与用 Compile 函数编译好的正则匹配的话,MatchString 函数就会返回'true'.packagemainim......
  • golang实现tcp自动重连示例程序
    参考代码:packagemainimport("fmt""net""time")funcdoTask(){time.Sleep(1*time.Second)main()}funcmain(){for{conn,err......