2022年4月12日 Go生态洞察:何时使用泛型 ️


🌷🍁 博主猫头虎(🐅🐾)带您 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生态,共同成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/210534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标检测——Fast R-CNN算法解读

论文:Fast R-CNN 作者:Ross Girshick 链接:https://arxiv.org/abs/1504.08083 代码:https://github.com/rbgirshick/fast-rcnn 目录 1、算法概述2、Fast R-CNN细节2.1The RoI pooling layer2.2 Fine-tuning for detection2.3 Fast…

火星探索:技术挑战与前沿进展

火星探索:技术挑战与前沿进展 一、引言 火星,这颗红色的星球,长久以来一直吸引着人类的目光。随着科技的飞速发展,火星探索已经从纯粹的科幻梦想逐渐转变为现实的研究课题。然而,火星探索仍然面临着诸多技术挑战。本文将深入探讨火星探索的关键技术、现有技术瓶颈以及前沿…

【FPGA图像处理实战】- 图像基础知识

视频图像处理是FPGA主要应用方向之一,很多FPGA从事或准备进入这一领域,我们现在开始发布新的FPGA实战专栏——FPGA图像处理。 FPGA处理视频图像处理的主要优势是流水线和并行处理运算,特别是现在视频分辨率越来越大,从720p到1080…

文字、图片免费生成视频和专属数字人,你不来试试吗?

查看生成的效果:AI产生的视频(关注公众号,获取精彩内容) 您是否想要制作一些令人惊叹的视频,但又没有视频编辑的技能或经验?您是否想要利用人工智能的力量,让您的图片和声音变成动态的视频&…

二叉树链式结构的实现——C语言

目录 一、提前说明 二、二叉树的遍历 2.1前序遍历 2.2中序遍历 2.3后序遍历 2.4代码 三、二叉树结点个数 3.1整体思路 3.2代码 四、二叉树叶子结点个数 4.1整体思路 4.2代码 五、二叉树的高度(深度) 5.1整体思路 5.2代码 六、二叉树第k层节点个数 6.1整体…

selenium三猛士

selenium包括三个项目,分别是:Selenium WebDriver,Selenium IDE,Selenium Grid。 Selenium WebDriver Selenium WebDriver是客户端API接口,测试人员通过调用这些接口,来访问浏览器驱动,浏览器再访问浏览器…

数学建模 | MATLAB数据建模方法--机器学习方法

近年来,全国赛的题目中,多多少少都有些数据,而且数据量总体来说呈不断增加的趋势, 这是由于在科研界和工业界已积累了比较丰富的数据,伴随大数据概念的兴起及机器学习技术的发展, 这些数据需要转化成更有意…

Linux的基本指令(4)

目录 20.tar指令(重要):打包/解包,不打开它,直接看内容 21.bc指令 22.uname –r指令: 23.重要的几个热键[Tab],[ctrl]-c, [ctrl]-d 20.tar指令(重要):打包/解包&#…

Kubernetes(K8s)Pod控制器详解-06

Pod控制器详解 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建 控制器创建…

分享85个节日PPT,总有一款适合您

分享85个节日PPT,总有一款适合您 85个节日PPT下载链接:https://pan.baidu.com/s/1FTbSj2Baix-Cj6n42Cz26g?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。…

语义分割 U-net网络学习笔记 (附代码)

论文地址:https://link.springer.com/chapter/10.1007/978-3-319-24574-4_28 代码地址:https://b23.tv/PCJJmqN 1.是什么? Unet是一种用于图像分割的深度学习网络模型,其结构由编码器和解码器组成,可以对图像进行像素…

深度学习 -- 神经网络

1、神经网络的历史 2、 M-P模型 M-P模型是首个通过模仿神经元而形成的模型。在M-P模型中,多个输入节点对应一个输出节点y。每个输入x,乘以相应的连接权重w,然后相加得到输出y。结果之和如果大于阈值h,则输出1,否则输出0。输入和输出均是0或1。 公式2.1: …

【代码】多种调度模式下的光储电站经济性最优 储能容量配置分析matlab/yalmip

程序名称:多种调度模式下的光储电站经济性最优储能容量配置分析 实现平台:matlab-yalmip-cplex/gurobi 代码简介:代码主要做的是一个光储电站经济最优储能容量配置的问题,对光储电站中储能的容量进行优化,以实现经济…

08-中介者模式-C语言实现

中介者模式: Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.(用一个中介对…

2243:Knight Moves

文章目录 题目描述思路1. DFS2. BFS3. 动态规划 解题方法1. DFS2. BFS3. 动态规划 题目描述 题目链接 翻译如下: 注:骑士移动是和象棋里的马一样走的是日字型 你的一个朋友正在研究旅行骑士问题 (TKP),你要找到最短的…

结合贝叶斯定理浅谈商业银行员工异常行为排查

1.贝叶斯定理的数学表达 贝叶斯方法依据贝叶斯定理。关于贝叶斯定理解释如下:首先我们设定在事件B条件下,发生事件A的条件概率,即 ,从数学公式上,此条件概率等于事件A与事件B同时发生的概率除以事件B发生的概率。 上述…

VUE语法-(readonly的用法)将数据设置成只读模式

1、功能概述 在Vue中定义一个变量,这个变量的值不允许被修改,核心是通过readonly设置成只读。 如果不会使用ref和reactive响应式数据参考如下博客: https://blog.csdn.net/tangshiyilang/article/details/134701103 2、具体实现 如下案例…

轻量级万物分割SAM模型——MobileSAM安装实测摘要

目录 0、前言1、准备工作安装python环境说明安装说明 运行测试app安装依赖修改代码 2、实际测试效果自带图片测试其它图片测试1其它图片测试2 总结 0、前言 本文将介绍一种轻量级万物分割SAM模型——MobileSAM的安装和实测情况。SAM是meta公司的一种图像分割大模型&#xff0c…

摩根士丹利:人工智能推动增长

摩根士丹利(NYSE:MS)将人工智能战略整合到其财富管理业务中,标志着竞争性金融格局迈出了变革性的一步。该公司的人工智能计划,包括与 OpenAI 合作开发人工智能聊天机器人,促进了其财富部门的显着增长。值得…

VSCode 开发C/C++实用插件分享——codegeex

VSCode 开发C/C实用插件分享——codegeex 一、codegeex 一、codegeex CodeGeeX 智能编程助手是一款编程插件,CodeGeeX支持多种主流IDE,如VS Code、IntelliJ IDEA、PyCharm、Vim等,同时,支持Python、Java、C/C、JavaScript、Go等多…