🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁
🦄 博客首页——🐅🐾猫头虎的博客🎐
🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》 🐅 学会Golang语言,畅玩云原生,走遍大小厂~💐
🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
☁️🐳
Go语言开发者必备技术栈☸️
:
🐹 GoLang | 🌿 Git | 🐳 Docker | ☸️ Kubernetes | 🔧 CI/CD | ✅ Testing | 💾 SQL/NoSQL | 📡 gRPC | ☁️ Cloud | 📊 Prometheus | 📚 ELK Stack
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥
文章目录
- 🐅🐾猫头虎建议Go程序员必备技术栈一览表📖:
- 2022年4月12日 Go生态洞察:何时使用泛型 🛠️
- 摘要
- 引言
- 正文
- 📘 编写代码的通用指南
- 🎯 何时类型参数有用?
- 1. 使用语言定义的容器类型
- 2. 通用数据结构
- 3. 更倾向于函数而非方法
- 4. 实现通用方法
- 🚫 何时不使用类型参数?
- 1. 不要用类型参数替换接口类型
- 2. 方法实现不同时不使用类型参数
- 3. 适当时使用反射
- 总结
- 下一篇预告
- 原创声明
-
原创作者: 猫头虎
-
作者wx: Libin9iOak
-
作者公众号: 猫头虎技术团队
2022年4月12日 Go生态洞察:何时使用泛型 🛠️
摘要
🐾 大家好,猫头虎博主来啦!今天我们要一起探讨Go 1.18引入的一个重大新特性——泛型编程。这不仅是关于泛型是什么,或如何使用它们,更重要的是,何时在Go代码中使用泛型,以及何时不使用它们。如果你正困惑于Go泛型的应用场景,那这篇文章正合你意!🌟
引言
Go 1.18的发布为Go语言带来了支持泛型编程的重大更新。泛型编程扩展了Go语言的灵活性和表达力,但同时也带来了何时使用泛型的问题。在这篇文章中,我将基于Ian Lance Taylor的演讲内容,深入探讨这个问题。
正文
📘 编写代码的通用指南
开始编写Go程序时,应先编写代码,而不是定义类型。如果你在定义类型参数约束时已开始编程,可能走错了方向。先从编写函数开始。在明确类型参数有用时再添加它们是很容易的。
🎯 何时类型参数有用?
1. 使用语言定义的容器类型
当编写操作语言定义的特殊容器类型(如切片、映射、通道)的函数时,类型参数可能会很有用。例如,这是一个返回任何类型映射键的切片的函数:
func MapKeys[Key comparable, Val any](m map[Key]Val) []Key {
s := make([]Key, 0, len(m))
for k := range m {
s = append(s, k)
}
return s
}
2. 通用数据结构
对于像切片或映射这样的通用数据结构,使用类型参数可能会有用。例如,下面是使用类型参数的二叉树数据结构的一部分:
type Tree[T any] struct {
cmp func(T, T) int
root *node[T]
}
func (bt *Tree[T]) Insert(val T) bool {
// ... 实现细节 ...
}
3. 更倾向于函数而非方法
在需要比较函数时,更倾向于使用函数而非方法。例如,我们可以将ElementType.Compare
作为比较函数而不是要求Tree
的元素类型具有Compare
方法。
4. 实现通用方法
当不同类型需要实现一些通用方法,并且不同类型的实现都看起来相同时,使用类型参数是有用的。例如,实现标准库的sort.Interface
:
type SliceFn[T any] struct {
s []T
less func(T, T) bool
}
func (s SliceFn[T]) Len() int {
// ... 实现细节 ...
}
🚫 何时不使用类型参数?
1. 不要用类型参数替换接口类型
如果只需对某种类型的值调用方法,请使用接口类型,而不是类型参数。
2. 方法实现不同时不使用类型参数
如果每种类型的方法实现都不同,则使用接口类型并编写不同的方法实现,而不是使用类型参数。
3. 适当时使用反射
Go有运行时反射功能,如果某些操作即使在没有方法的类型上也必须支持,且对每种类型的操作都不同,则使用反射。
总结
泛型为Go语言带来了新的编程范式,但它们并不总是必要或有益的。了解何时使用泛型,将帮助你更有效地利用Go语言的强大
功能。本文被猫头虎的Go生态洞察专栏收录,详情点击这里。
要点 | 描述 |
---|---|
编写代码指南 | 先编写代码,再考虑类型参数 |
类型参数的使用场景 | 操作容器类型、实现通用数据结构、实现通用方法 |
不适用类型参数的情况 | 替换接口类型、方法实现不同、需要使用反射 |
下一篇预告
下一篇文章将深入分析《Go开发者调查2021结果》。我们将一起探索Go社区的最新动态和趋势。敬请期待! 🌟 了解更多�
原创声明
======= ·
-
原创作者: 猫头虎
-
作者wx: Libin9iOak
-
作者公众号: 猫头虎技术团队
学习 | 复习 | Go生态 |
---|---|---|
✔ | ✔ | ✔ |
本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。
作者保证信息真实可靠,但不对准确性和完整性承担责任。
未经许可,禁止商业用途。
如有疑问或建议,请联系作者。
感谢您的支持与尊重。
点击
下方名片
,加入IT技术核心学习团队。一起探索科技的未来,洞察Go生态,共同成长。