当前位置: 首页 > news >正文

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.lryc.cn/news/365666.html

相关文章:

  • TSP(Python):Qlearning求解旅行商问题TSP(提供Python代码)
  • 【精通NIO】NIO介绍
  • ssh远程管理
  • 【ai】pycharm远程ssh开发
  • leetcode 9 回文数
  • 学习Python的基础知识
  • 第五届上海市青少年算法竞赛网络同步赛(小学组)
  • 【区分vue2和vue3下的element UI Cascader 级联选择器组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • pottery,一个超酷的 Python 库!
  • 【Android面试八股文】在Java中重载和重写是什么意思,区别是什么?
  • 【第二篇】SpringSecurity源码详解
  • 基于Python+FFMPEG环境下载B站歌曲
  • 静态 VxLAN 浅析及配置示例(头端复制)
  • 2023年与2024年AI代理基础设施的演进:六大关键变化
  • 实验三-8086指令的应用《计算机组成原理》
  • 《维汉翻译通》App全新升级:维吾尔语短文本翻译、汉语拼音标注、维语词典、谚语格言名句等功能统统免费!还支持维吾尔文OCR识别提取文字!
  • 全年申报!2024年陕西省双软企业认定条件标准、申报好处费用
  • 系统移植 (以将Linux系统移植到S5P6818开发板为例)
  • 超长正整数的加法
  • C++ - 查找算法 和 其他 算法
  • 字符串的信号(SIGNAL)和槽(SLOT)的宏连接方式弊端
  • Kali linux学习入门
  • selenium中,怎么判断是否已选多选框
  • WindowManager相关容器类
  • 零售行业运营有哪些业务场景?详解各业务场景的分析指标和维度
  • 无锡哲讯携手SAP,赋能装备制造业数字化转型
  • TPM仿真环境搭建
  • 提高篇(五):使用Processing创作互动艺术:从灵感到实现
  • 华为od-C卷100分题目-3用连续自然数之和来表达整数
  • Chrome 自动执行 JS 脚本 | Tampermonkey 插件