作者: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反射内存卡简单介绍
如何使用多线程或多核设计数字音频系统