Golang泛型的使用

作者:shadowyd
关键字参数
众所周知很多语言的function 中都支持 key=word 关键字参数, 但 golang 是不支持的, 我们可以利用泛型去简单的实现.
func defaultkeywordparams[d any](defval d, params ...d) d {      if len(params) == 0 {              return defval      }      return params[0]}func test(category ...string) {  // 不填写则返回默认值  realcategory := defaultkeywordparams[string](agroup, category...)  fmt.println(realcategory)}func main () {   test()}  
快速排序
updateat: 2023-02-22
实现一个可进行控制反转的通用类型快速排序, 解决一下原生的sort包进行类型定义的繁琐.
// quicksort 通用快速排序func quicksort[t any](arr []t, comparefn func(a, b t) bool) {      if len(arr) < 2 {              return      }      pivot := arr[0]      left := 1      right := len(arr) - 1      for left <= right {              if comparefn(arr[left], pivot) {                      left++              } else if comparefn(pivot, arr[right]) {                      right--              } else {                      arr[left], arr[right] = arr[right], arr[left]              }      }      arr[0], arr[right] = arr[right], arr[0]      quicksort(arr[:right], comparefn)      quicksort(arr[right+1:], comparefn)}  
测试用例
func testquicksort(t *testing.t) {      nums := []int{9, 3, 1, 7, 4, 8, 6, 2, 5}      fmt.println(unsorted:, nums)      quicksort[int](nums, func(a, b int) bool {              return a < b      })      fmt.println(sorted:  , nums)      strs := []string{orange, apple, banana, kiwi, grape}      fmt.println(unsorted:, strs)      quicksort[string](strs, func(a, b string) bool {              return len(a)  this.pagecnt {              return []t{}      }      startidx := (this.offset - 1) * this.limit      endidx := startidx + this.limit      if endidx > this.total {              endidx = this.total      }      return this.list[startidx:endidx]}func (this *pager[t]) output() *pagelist[t] {      return &pagelist[t]{              total: this.total,              page:  this.offset,              size:  this.limit,              list:  this.list,      }}// testfunc main () {  page := newpager[int]([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})      list := page.offset(1).limit(3).filter(func(item interface{}) keepitem {  if *item.(*int)%2 == 1 {   return true  }  return false      }).list()      fmt.println(list)}  
通用初始化模型
可以解决在多态下使用同一个初始化函数进行对象初始化, 写法上有点绕大家自行多实验几次就能明白.
type modelobj interface {      user | product}type user struct {      uid int}func (this *user) setid(id int) {      this.uid = id}type product struct {      pid int}func (this *product) setid(id int) {      this.pid = id}// trimmodelobj 是一个动态类型的 interface, 由m决定当前interface的最终类型type trimmodelobj[m modelobj] interface {      *m      setid(id int)}// trimmodelobj[model] 由第二个参数决定当前的动态类型;// newmodelobj[*user, user](32) 如 model 是 user 类型, 最终 trimmodelobj == *user,所以我们需要为 trim 传递 *userfunc newmodelobj[trim trimmodelobj[model], model modelobj](id int) trim {      m := new(model)      t := trim(m)      fmt.printf(%p , m)      // 类型转换成指定的*model      t.setid(id)      return t}func main() {      // new user model object      user := newmodelobj[*user, user](32)      fmt.printf(%p , user)      fmt.printf(%t , user)      fmt.println(user.uid)      // new product model object      prod := newmodelobj[*product, product](18)      fmt.printf(%p , prod)      fmt.printf(%t , prod)      fmt.println(prod.pid)}  


加速制造业创新设计的“芯”选择
如今的诺基亚怎么样了
工业互联网平台助力构建集中供冷在线监测系统
霍尔传感器的注意事项
崛起中的车用电子市场与相关测试重点
Golang泛型的使用
LED灯带失效分析
变频空调解读
02:汽车传感器的应用方案
深入了解Android Studio的最新功能
基于Arduino和MAX30205的数字温度计
量子计算的安全性存在一定程度的不确定性
光栅位移传感器的组成结构
小鹏汽车参与布局 快充需求带动硅基负极放量
惯性导航工作原理及系统分类
正弦交流电的产生
人工智能解决方案正在芬兰坦佩雷推广
u-remote: 让船舶自动化狂飙加速
PCI-5565PIORC-210000反射内存卡简单介绍
如何使用多线程或多核设计数字音频系统