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) introot *node[T]
}func (bt *Tree[T]) Insert(val T) bool {// ... 实现细节 ...
}
3. 更倾向于函数而非方法

在需要比较函数时,更倾向于使用函数而非方法。例如,我们可以将ElementType.Compare作为比较函数而不是要求Tree的元素类型具有Compare方法。

4. 实现通用方法

当不同类型需要实现一些通用方法,并且不同类型的实现都看起来相同时,使用类型参数是有用的。例如,实现标准库的sort.Interface

type SliceFn[T any] struct {s    []Tless 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生态,共同成长。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式Linux程序开发综合实验】-1(附流程图) | ARM开发板 | 测试“Hello World” | Makefile文件 | 实现加法相加

任务:编写在标准输出终端输出“Hello World!”的C语言代码以及输入指定数字相加结果、Makefile,并分别编译出在PC与ARM上运行的可执行程序文件。 设备以及工具 硬件:Linux开发板、PC机、串口连接线 图1 Linux开发板以及串口接线 …

LED屏幕信息安全如何预防?

随着科技的不断进步,LED屏幕在我们生活和工作中扮演着越来越重要的角色,然而,随之而来的是信息安全面临的挑战。为了有效预防LED屏幕信息的泄露和被盗取,我们需要采取一系列的安全措施。以下是一些建议: 物理安全措施&…

【 RTTI 】

RTTI 概念: RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检 查着这些指针或引用所指的对象的实际派生类型。 原因: C是一种静态类 型语言。其数据类型是在编译期就确定的,不能在运…

【DPDK】Trace Library

概述 跟踪是一种用于了解运行中的软件系统中发生了什么的技术。用于跟踪的软件被称为跟踪器,在概念上类似于磁带记录器。记录时,放置在软件源代码中的特定检测点会生成保存在巨大磁带上的事件:跟踪文件。稍后可以在跟踪查看器中打开跟踪文件…

密码学学习笔记(二十二):RSA签名方案

在RSA中,计算公钥的欧拉函数和私钥是关键步骤。 如何计算呢? RSA算法中的是两个质数 p 和 q 的乘积。所以两个质数必须要找到。一旦找到 p 和 q就可以使用公式() (p-1) (q-1)来计算。 计算私钥d 私钥 d 是满足 e*d ≡ 1 mod   的整数。换句话说&a…

Android studio Load error:undefined path variables

android stuido 报错 Load error:undefined path variables Gson is undefined 处理方法: 点击进行Sync Project with Gradle Files

指针综合运用第一期

1.int**p的含义:*p表示这是一个指针,int*表示它指向的类型是int型的指针 2.*在打印或赋值时表示解引用,(向右对应),如**p,为*p的解引用指向某个指针,再进行解引用得到确定的值 3.指…

如何解决“该公众号提供的服务出现故障,请稍后再试”

出现“该公众号提供的服务出现故障,请稍后再试” , 或者是出现 “公众号接口出现异常,请加入微信群接收接口报警” 的提问, 出现这个一般是开发者自身服务器出现问题导致的。 本文我来教大家如何排查。 第一步:加入告…

一个简单的参数帮助框架,c实现

文章目录 具体实现如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> void print_help(char *argv[]) { printf("Usage: %s [options]\n", argv[0]); printf("Options:\n"); printf(" -h, -…

Leetcode—704.二分查找【简单】

2023每日刷题&#xff08;四十七&#xff09; Leetcode—704.二分查找 实现代码 int lower_bound(int* arr, int numsSize, int tar) {int left 0, right numsSize;int mid left (right - left) / 2;while(left < right) {mid left (right - left) / 2;if(arr[mid] …

Mysql的页结构详解

1.数据库的存储结构&#xff1a;页 索引结构为我们提供了搞笑的查找方式&#xff0c;索引信息和数据记录都在保存在文件上的&#xff0c;准确地说&#xff0c;是保存在“页”结构中。 1.1磁盘与内存的基本交互单位&#xff1a;页 InnoDB将数据划分为若干个页&#xff0c;Inn…

vmware 安装 AlmaLinux OS 8.6

选择系统镜像 选择镜像 选择安装位置和修改名称 可以自定义硬件&#xff0c;也可以不选择&#xff0c;后面可以再设置 自定义硬件可以设置内存和cpu等信息 安装虚拟机系统 密码如果简单的话需要点击两次done 才能保存