GO——泛型

泛型

  • 对于强类型语言,在编写代码时不事先指定类型,在实例化的时候作为参数指明类型

参考:https://www.liwenzhou.com/posts/Go/generics/

什么时候使用泛型?

  • 方法中的代码实现与类型T无关
  • 参考:https://juejin.cn/post/7089321525781725214
  • interface与泛型
    • 操作没有方法的类型,interface类型不适用
    • 每个类型的操作逻辑不一样,泛型不适用

泛型与继承的区别

  • 参考:https://www.cnblogs.com/wdmx/p/9922371.html
  • 泛型是指广泛的类型,是横向的
    • 用在与类型无关的函数中
      • 比如函数将相同的算法作用到不同的类型上,类型在使用的时候再确定
  • 继承是垂直的
    • 不同的类型之间有了共同的方法,会抽象出来一个父类。
    • 多态,相同的方法,不同的实现
  • 我的理解
    • 继承:不同的对象,有相同的方法名,但是实现不同,属于同一个类
    • 泛型:不同的对象,作用在他们身上的逻辑相同,与他们的类型无关,可用泛型。

方法与函数

  • 参考:https://juejin.cn/post/6894899185221697550
  • 方法是包含了接受者的函数
    • 方法属于类
    • 函数就是代码集合

泛型与interface?

  • interface可以认为是基类,走继承的那条道
  • interface也可以实现泛型
  • 参考:https://golang3.eddycjy.com/posts/generics-history/
    • interface在类型上太随意
      • 比如add(a,b),a,b应该是同一类型,但是调用的时候我可以传入不同类型,为了不出问题,还得在函数里面做类型判断
    • 泛型在编译时有类型校验
    • 泛型相较于接口的优点
      • 更安全:编译早期发现错误
      • 更高效:静态类型

代码示例

package mainimport "log"//继承type StructBase interface {GetName() string
}type StructA struct {Name    stringColumnA string
}func (a StructA) GetName() string {return a.Name
}type StructB struct {Name    stringColumnB string
}func (b StructB) GetName() string {return b.Name
}func PrintName(s StructBase) {log.Println(s.GetName())
}// 泛型
func reverse(arr []int) []int {res := make([]int, len(arr))for i := len(arr) - 1; i >= 0; i-- {res[len(arr)-1-i] = arr[i]}return res
}func reverseGeneric[T any](arr []T) []T {res := make([]T, len(arr))for i := len(arr) - 1; i >= 0; i-- {res[len(arr)-1-i] = arr[i]}return res
}func main() {//泛型测试arr := []int{1, 2, 3, 4, 5}log.Println(reverse(arr))log.Println(reverseGeneric(arr))log.Println(reverseGeneric(arr))log.Println(reverseGeneric([]int{1, 2, 3, 4, 5}))arr2 := []string{"a", "b", "c", "d", "e"}log.Println(reverseGeneric(arr2))//继承测试log.Println("=========================================")PrintName(StructA{Name: "structA", ColumnA: "columnA"})PrintName(StructB{Name: "structB", ColumnB: "columnB"})}

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

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

相关文章

day52 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。 动态规划五部曲 1.确定dp数组以及下标的含义 一天一共就有五个状态, 没有操作 (其实我们也可以不设置这个状态&a…

oracle自带性能分析脚本

1、awr 报告 AWR 包含了数据库运行情况的详细信息收集,常用于分析收集性能问题。 脚本:awrrpt.sql2、ash 报告 ash 能抓取到比 AWR 报告更细节的信息,可以精确到分钟,默认为获取当前时间到15分钟前的报告 脚本:ashrp…

Docker 国内镜像源更换

实现 替换docker 镜像源 前提要求 安装 docker docker-compose 参考创建一键更换docker国内源 vim /docker_daemon.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han # Email: CIASM@CIASM # Date: 2024/06/07 # docker daemon.jsondaemon_json_file="/et…

[网络基础]——计算机网络(OSI)参考模型 详解

🏡作者主页:点击! 🌐网络通信基础TCP/IP专栏:点击! ⏰️创作时间:2024年6月2日21点59分 🀄️文章质量:93分 目录 🎟️OSI基本概念 🎄分层架构…

使用Qt实现文本文件的读写操作

文章目录 文本读写简介QFileDialog简介常用方法示例代码 QFile简介常用方法示例代码 QTextStream简介常用方法示例代码 结合使用示例完整示例代码(读写操作,可直接复制运行我使用的Qt版本为QT5.14)mainwindow.hmainwindow.cppmain.cpp代码解释 文本读写简介 在现代…

前端经典面试手写题

前端面试中常会遇到的手写题主要考察应聘者对前端基础知识的掌握程度以及编程能力。以下是一些经典的前端手写题及其解答思路: 手写深拷贝(Deep Clone) 深拷贝是指复制一个对象及其所有子对象,使得新的对象和原对象完全独立。 …

Python爬虫实战:解析京东商品信息(附部分源码)

在信息爆炸的今天,网络爬虫(Web Scraping)作为一种自动获取网页内容的技术,已经成为数据采集的重要手段。Python,因其简洁的语法和强大的库支持,成为编写爬虫的首选语言之一。本文将通过一个实战案例&#…

聊聊DoIP吧(二)-报文结构和时间参数

书接上回,DoIP报文及其在以太网帧中的位置:图片来自Vector官网 这里我们来看看DoIP报文结构: DoIP协议时间参数详解 - 知乎 (zhihu.com)

实验三-8086指令的应用《计算机组成原理》

一、实验目的 掌握8086指令的应用 二、实验原理 三、实验仪器 计算机1台,emu8086软件。 四、实验步骤 1、建立00H~0FH~00H 31个数,00H~0FH数据逐渐增大,0FH~00H逐渐减小,即DI指针所表示的地…

linux进程间通讯指南-打通IPC大门,高效沟通无阻

在现代操作系统中,进程就像独立的个体,有时需要相互合作、数据共享,这就要求进程间能够高效通信。本文将为你揭开Linux进程间通信(IPC)的神秘面纱,探讨各种IPC工具的运作原理,同步机制的重要性,以及如何规避…

手动安装Nvidia驱动和CUDA Toolkit

1、打开cuda-toolkit 网站 CUDA Toolkit Archive | NVIDIA Developer 根据自己需要选择CUDA Toolkit版本,这里选择12.0.0 2、点击链接跳转到下载页面,选择操作系统类型和安装包类型 3、下载CUDA Toolkit 安装包 4、执行下载命令 wget https://develo…

【C语言】学生管理系统:完整模拟与实现

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 🔥引言 本篇文章为修改了在校期间实训报告,使用C…

undefined与null的区别

null表示"没有对象",即该处不应该有值。 (1) 作为函数的参数,表示该函数的参数不是对象。 (2) 作为对象原型链的终点。 Object.getPrototypeOf(Object.prototype) // nullundefined表示"…

Qt+qss动态属性改变控件状态切换的样式

先说点基础的吧,qt的样式实现,常见的主要有三种方式,分别为: 1.ui界面中右键样式表直接添加 2.代码中对控件设置样式setStyleSheet 3.外部预设好qss文件,代码中加载后设置样式 实际工作开发中,我推荐使用优…

停止一个正在运行的线程

暴力停止方法 stop 该方法是不安全的,已经过时的方法,在其方法描述上 This method is inherently unsafe,这个方法实际上是不安全的 package com.alibaba.fescar.core.protocol.test;public class TestThreadStop {public static void main(S…

基于STM32开发的智能水族箱管理系统

目录 引言环境准备智能水族箱管理系统基础代码实现:实现智能水族箱管理系统 4.1 温度传感器数据读取4.2 水泵与加热器控制4.3 水位传感器数据读取4.4 用户界面与显示应用场景:水族箱管理与优化问题解决方案与优化收尾与总结 1. 引言 智能水族箱管理系…

day51 动态规划 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 动态规划 1.确定dp数组(dp table)以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金 ,这里可能有同学疑惑,本题中只能买卖一次,持有股票之后哪还有现金呢? 其实一开始现…

web学习笔记(六十五)

目录 1. Hash模式和History模式 2. 导航守卫 3. 路由元信息 1. Hash模式和History模式 Hash模式(历史模式)和History模式(哈希模式)是匹配路由的两种模式,一般默认配置Hash模式,可以在index.js页面中将路…

几种在ARM MCU上控制流水灯的方法

对于初学者,在ARM单片机上控制流水灯的亮灭是必经之路。控制流水灯的亮灭有很多方法,比如8个LED,可以控制8灯同时亮、灭;可以控制8灯依次亮、灭;可以控制8灯依次亮、灭,然后反方向再依次亮、灭;…

python-NLP常用数据集0.1.012

XNLI数据集 用户语言翻译和跨语言分类的语料库 官网地址:https://github.com/facebookresearch/XNLI下载地址:https://dl.fbaipublicfiles.com/XNLI/XNLI-1.0.zip注意事项:数据集有json格式的,和txt格式的数据格式 txt格式 la…