Go1。17初识泛型
最近,笔者在刷算法题时有这样的苦恼:算法题中会有很多的排序、比较题型,由于Go是强类型语言,就意味着需要针对不同的类型写出若干相同逻辑的代码,且重复度非常高。
就拿 int、float64 类型的两个数值比较大小来说,有几种写法。 1. 数值比较的几种写法青铜 - 普通写法func TwoIntNumMax(a, b int) int{ if a > b { return a } return b } func TwoFloat64NumMax(a, b float64) float64{ if a > b { return a } return b }
可以看出:除了类型不同,函数体中代码逻辑一模一样。然而,这里仅仅才是两种类型。假设,把所有的数值类型都写上一遍,那代码量也是不少。关键是作为有追求的程序员来说,岂能容忍这种做法。 白银 - 使用 interface 的写法func TwoNumMax(a, b interface{}) (interface{}, error) { ta := reflect.ValueOf(a) tb := reflect.ValueOf(b) switch ta.Kind() { case reflect.Int: if tb.Kind() != reflect.Int { returnnil, ErrType } if ta.Int() > tb.Int() { return a, nil } return b, nil case reflect.Float64: if tb.Kind() != reflect.Float64 { returnnil, ErrType } if ta.Float() > tb.Float() { return a, nil } return b, nil default: returnnil, ErrUnSupport } } func TestMax(t *testing.T) { r, err := TwoNumMax(1, 2) if err != nil { t.Fatal(err) } max := r.(int) fmt.Println("max number is ", max) }
看似只提供了一个比较方法,但是进到该方法才会发现其中的复杂。如果把其他数值类型都写上的话,那么这个方法会变成一个巨无霸。这里使用 interface 相当于把每一种分开写的方法,糅合在了一个方法里面,结果可想而知。
鉴于以上,在写代码时,笔者感觉很痛苦:究其根源在于写出来的代码量大、重复度高、还不美观。那有没有其他可能? 王者 - 泛型写法// 泛型类型约束,MinMaxAble 代表 多种类型 type MinMaxAble interface { // 使用 type 来定义支持的类型 typeint, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64 } // MinMaxAble 泛型类型约束 // T 泛型标识, 可以看做是代表了其支持的类型 func max[T MinMaxAble](a, b T) T { if a > b { return a } return b } func TestMax2(t *testing.T) { // 写法1 使用 [int] 来明确指明 泛型的类型 maxNum := max[int](1, 2) fmt.Println(maxNum) // 写法2 不使用 [int] 来明确指明泛型的类型 // 此时 编译器自己会进行泛型类型推断 maxNum2 := max(1, 2) fmt.Println(maxNum2) maxNum3 := max[float64](1.1, 2.1) fmt.Println(maxNum3) maxNum4 := max(1.1, 2.1) fmt.Println(maxNum4) }
似乎发现了了不起的事情!简简单单几行代码,实现了多种数值类型的数值比较,这是什么黑魔法?
对此, 需要了解如下信息: 泛型将在 go1.18版本 开始正式支持泛型截止目前(2021/08/20)最新的 go1.17版本 中处于试验阶段go1.17版本 中 开启泛型 ,需要添加 gcflags go run -gcflags=-G=3 ./main.go
通过 -gcflags=-G=3 在 go1.17 中开启泛型 go1.17版本 中泛型代码方法或函数不可导出 (只能在当前包中使用)2. 如何使用泛型
如果想在体验泛型乐趣,需要做如下步骤: 升级go版本到 1.17 推荐使用 go 的多版本管理程序 gvm
https://github.com/moovweb/gvm 编写 泛型示例代码,编译运行时需要添加 gcflags 使用最新版本 Goland IDE ,安装 go1.17 SDK 3. Go泛型示例代码
关于网上go泛型的示例代码,笔者这里推荐两个地方查看。 https://github.com/mattn/go-generics-example/blob/main/add/main.go go1.17源码中 go1.17/src/go/types/testdata 总结
对于Go来说,泛型的出现是个必然结果。一方面可以简化代码逻辑,另一方面可以在编译时就能确认类型 (interface 在运行时才能确定类型),对于类型不匹配的情况,不至于在运行时才检测出来导致程序崩溃。
还有一点需要各位提前做好准备,等到 go1.18版本 之后,Go的标准库、各种知名库包以及开源程序,一定会基于泛型进行较大的改动。
路漫漫其修远兮吾将上下而求索,笔者相信Go的未来是光明的。
哪个App播放器音质最好,无损音乐最多?我习惯把音乐下载下来听,用Foorbar2000播放。既然听无损就不用考虑音效了。原汁原味播放就是最好,还原音乐本来面目。所以手机我推荐本地播放器。电脑我推荐foobar2000。
AppleWatchSeries7正式上市,依旧加量减价,它值得购买吗?苹果在9月份的发布会中,推出了AppleWatchSeries7,不过当时并没有正式上市,只是表示秋末发售。10月8日晚上8点,苹果正式上市了AppleWatchSeries7。这
净水器排名有哪些品牌推荐冰尊净水器是世界净水器十大排名领导品牌。从传统净水器,到现在的厨房净水全屋净水,净水产品在不断升级迭代,净水器技术一直在优化升级,给中国的万千家庭带去了健康的饮水生活。下面就为大家
资深Linux运维工程师必须掌握的核心命令查看计算机硬件系统信息服务器核心硬件就是CPU内存磁盘和网卡,它们配置的好坏会影响程序的运行效率,我们可以使用命令的方式查看服务器硬件的配置查看CPU信息查看CPU信息可以使用ls
未来三年,青浦区发展潜力如何,入手亏吗?前途一片光明,前景不可限量上海未来重点发展大虹桥和五大新城,青浦这两个都有,前景很好,值得入手。青浦未来可期,青浦赵巷漕河泾开发区引进高科技人才11万人口,朱家角华为产业园已经拿地
有多少人信了读书不如去打工?读书不如去打工,读书开始是挣不到钱的,还要花钱,最少书要花钱买的。打工是打一天工挣一天钱的,能不能拿到是另外一回事。读书是可以挣长远的,不要挺卖力气的钱,有可能岁数越大挣的越多噢偷
高密的父老乡亲对莫言是怎样的评价?好吧,既然头条推荐了你提出的问题,做为高密人,我就简单回答吧,我只回答我所了解的事实,对莫言不做任何评价。莫言,本名管谟业,出身中农。1955年2月17日(农历正月25),出生于山
花1999买了款红米K40,回来对比IQOOZ5后这下纠结了随着科技的不断发展,手机市场也迎来了大洗牌,以前的手机龙头华为如今已经暂时退圈,而二哥小米则靠着格局和战略做到了全球第二,继华为之后再次硬刚苹果。尤其是今年,小米和旗下的红米都推出
苹果下周二还有发布会?新机比iPhone13贵一倍国庆假期结束了,上班第一天急需来点爆炸消息让人清醒清醒!时隔大半个月,苹果第二场发布会就要来了!外媒曝光将在10月12日举行,依然是以线上的形式召开。主要的产品为AirPods3以
看家竟然如此简单小豚当家智能摄像头在1。0时代,就在视觉体验上极大满足了用户的需求。此次小豚摄像头双频版上线,华为和小豚当家在产品研发上做了充足的努力,性能做了大提升!采用了双频WiFi提升了设备
马斯克晋升全球首富!旗下SpaceX估值已超1000亿美元财联社(上海,编辑周玲)讯,据报道,在本周内部人士宣布二次售股后,特斯拉CEO埃隆马斯克(ElonMusk)旗下太空探索技术公司SpaceX估值已超过1000亿美元。这意味着马斯克