2.1.6 谈谈 Go 泛型GO CN 谈谈 Go 泛型 鸟窝(晁岳攀) 微服务框架 rpcx 作者 个人介绍 微服务框架rpcx作者,百度资深工程师 《100个Go语言错误及避坑指南》,译者之一。即将出版 《深入理解Go并发编程》,作者。封面占位用。即将出版 ’ alt=‘OCR图片’/> 回顾 Go 泛型 01 Go 泛型陷阱 02 最佳实践 03 改造 Go 项目 04 Top N Go 泛型库 05 第一部分 第一部分 回顾 Go 泛型 ’ alt=‘OCR图片’/> 泛型类型和泛型函数 泛型类型 类型参数 类型约束 type List[T any] struct { next *List[T] value T } 泛型函数 类型参数 类型约束 func min[T ~int|~float64] (x, y T) T { if x < y { return x } return y } 泛型类型的方法 func (l *List[T]) Len() int { … } 泛型方法? func (l *List) Len[V any] () int { … } ’ alt=‘OCR图片’/> 类型约束和接口0 码力 | 52 页 | 3.09 MB | 1 月前3
1.2.3 Go 泛型设计G CN Go泛型设计 赵柯 QQ音乐 Go泛型发展史 01 Go泛型设计实现提案 02 Go泛型底层实现原理 03 总结 04 第一部分 Go泛型发展史 ’ alt=‘OCR图片’/> 什么是泛型? 1967年,克里斯托弗·斯特雷奇在《Fundamental Concepts in Programming Languages》提出了两个概念: 特设多态(ad-hoc): void print(string type unknown struct {} func (u unknown) walk() {} func (u unknown) quack() {} ’ alt=‘OCR图片’/> 泛型困局 编码速度 or 编译速度 or 运行速度? C++(slow compiler) ’ alt=‘OCR图片’/> 早期提案 - Type Functions type Lesser(t) return a } return b } MyVector(t)(v)看上去像是两次函数调用 type关键字使用混乱 部分场景实现困难: 支持通用运算符 支持泛型方法 ’ alt=‘OCR图片’/> 早期提案-Generalized Types(广义类型) gen [t] type Lesser(t) interface { Less(t)0 码力 | 35 页 | 1.31 MB | 1 月前3
Go 1.18 中的泛型### Go 1.18 中的泛型 欧长坤 changkun.de/s/generics118 2022/03/30 ## 语法和使用 ## 什么时候需要泛型? 当使用接口作为函数的形参类型时,函数调用方传递的实际参数可以是完全不同的类型: type T interface { Add(T) T } func Sum(elem s ...T) (sum T) { // T 可以是任何实现 Add() (sum S) { // S 的底层类型必须底层类型为 int 约束的类型 for i := range elements { sum += elem[i] } return } 使用泛型的根本目的是:类型安全的参数传递,以及对实现的类型进行抽象  {} // OK 为什么第二个 bar 不会报错? ## 抽象能力 泛型没有任何运行时的机制,所以关于泛型的组件只发生在编译时期 对于下面的接口而言,无法作为普通参数使用: func Foo[T any]( ) {} x := Foo // ERROR: cannot use0 码力 | 45 页 | 501.50 KB | 2 年前3
JAVA 应用与开发 - 泛型应用与开发 泛 型 让我们愉快的 Coding 起来吧... 王晓东 中国海洋大学信息学院计算机系 October 5, 2018  ## 学习目标 ■ 理解泛型的概念,掌握其基本应用 ▶ 集合框架中的泛型 ▶ 泛型的向后兼容性 泛型的向后兼容性 ■ 掌握自定义泛型类和泛型方法 ▶ 理解类型参数 ▶ 理解差异性并能够定义自己的泛型类和泛型方法 ▶ 受限制的类型参数 ■ 学会处理泛型类型,包括使用通配符实现泛型容器遍历和操作 ## 大纲 1 泛型概念 2 泛型类与泛型方法 3 处理泛型类型 ## 泛型概念 ## 什么是泛型 ## 泛型(Generics) 泛型机制自 JDK 5.0 开始引入,其实质是将原本确定不变的数据类型参数化。 作为对原有 Java 类型体系的扩充,使用泛型可以提高 Java 应用程序的类型安全、可维护性和可靠性。 ## 什么是泛型 ## ☑ 集合框架中的数据造型问题 传统的集合容器为了提供广泛的适用性,会将所有加入其中的元素当作 Object 类型来处理。基于此原因,在实际使用时,我们必须将从集合中取出的元素值再强制转换(造型)为所期望的类型。 ## 什么是泛型 ## 集合框架中的数据造型问题 传0 码力 | 35 页 | 587.40 KB | 2 年前3
MoonBit月兔编程语言 现代编程思想 第六课 泛型与高阶函数现代编程思想 # 泛型与高阶函数 Hongbo Zhang ## 设计良好的抽象 - 软件工程中,我们要设计良好的抽象 - 当代码多次重复出现 ☐ 当抽出的逻辑具有合适的语义 - 编程语言为我们提供了各种抽象的手段 - 函数、泛型、高阶函数、接口..... ## 泛型函数与泛型数据 ## 堆栈 - 栈是一个由一系列对象组成的一个集合,这些对象的插入和删除遵循后进先出原则(Last } ## • 我们希望存储很多很多类型在堆栈中 ☐ 每个类型都要定义一个对应的堆栈吗? ☐ IntStack 和 StringStack 似乎结构一模一样? ## 泛型数据结构与泛型函数 ## - 泛型数据结构与泛型函数以类型为参数,构建更抽象的结构 1. enum Stack[T] { 2. Empty 3. NonEmpty(T, Stack[T]) 4. } 5. fn 11. } 12. } • 将 T 替换为 Int 或 String 即相当于 IntStack 与 StringStack ## 泛型数据结构与泛型函数 • 我们用 <类型1>,<类型2>, $ \ldots $ 来定义泛型的类型参数 enum Stack[T]{ Empty; NonEmpty(T, Stack[T]) } o struct Pair[A,0 码力 | 27 页 | 2.56 MB | 2 年前3
TypeScript 4.0 使用手册
React Angular 2 从JavaScript迁移到TypeScript 手册 基础类型 变量声明 接口 类 函数 泛型 枚举 类型推论 类型兼容性 高级类型 Symbols Iterators 和 Generators 模块 命名空间 - 从JavaScript迁移到TypeScript - 手册 - 基础类型 - 变量声明 - 接口 - 类 - 函数 - 字面量类型 - 泛型 - 枚举 - 类型推论 - 类型兼容性 - 高级类型 - Symbols - Iterators 和 Generators - 模块 - Angular 2 - 从JavaScript迁移到TypeScript - 手册 - 基础类型 - 变量声明 - 接口 - 类 - 函数 - 泛型 - 枚举 - 类型推论 - 类型兼容性 - 高级类型 - Symbols - Iterators 和 Generators - 模块 - 命名空间 - 命名空间和模块0 码力 | 683 页 | 6.27 MB | 2 年前3
从零蛋开始学 Rust## 二十二、 Rust 泛型 泛型 就是可以在运行时指定数据类型的机制。 泛型 最大的好处就是一套代码可以应用于多种类型。比如我们的 向量,可以是整型向量,也可以是字符串向量。 泛型 既能保证数据安全和类型安全,同时还能减少代码量。所以,现代语言,没有范型简直就是鸡肋。嘿,说的就是你,隔壁的 XX 语言。 Rust 语言中的泛型主要包含 泛型集合、泛型结构体、泛型函数、范型枚举 和 特质 几个方面。 ### 22.1 Rust 语言中的泛型 Rust 使用使用 语法来实现泛型的东西指定数据类型。其中 T 可以是任意数据类型。 例如下面的两个类型 age: i32 age: String 使用泛型,则可以直接声明为 age:T 然后在使用过程中指定 T 的类型为 i32 或 String 即可。 ### 22.2 泛型集合 日常使用过程中,我们最常见的泛型应用莫过于集合(collection)了。 数则会报错。 从某些方面说,泛型让集合更通用,也更安全。 ### 22.3 泛型结构体 我们也可以把某个结构体声明为泛型的,泛型结构体主要是结构体的成员类型可以是泛型。 泛型结构体的定义语法如下 struct struct_name{ field:T, } 例如我们可以定义一个泛型结构体 Data,它只有一个成员 value,类型是一个泛型。 struct Data 0 码力 | 168 页 | 1.24 MB | 2 年前3
TypeScript Handbook(中文版)
2.11 TypeScript 1.1 2.12 手册 3 基础类型 3.1 变量声明 3.2 接口 3.3 类 3.4 函数 3.5 泛型 3.6 枚举 3.7 类型推论 3.8 类型兼容性 3.9 高级类型 3.10 Symbols 3.11 Iterators 和 Generators TypeScript 1.4 - TypeScript 1.3 - TypeScript 1.1 - 手册 - 基础类型 - 变量声明 - 接口 - 类 - 函数 - 泛型 - 枚举 - 类型推论 - 类型兼容性 - 高级类型 - Symbols - Iterators 和 Generators - 模块 - 命名空间 - 命名空间和模块 需要注意的是字符串枚举成员不能被反向映射到枚举成员的名字。换句话说,你不能使用 Colors["RED"] 来得到 "Red"。 ## 增强的泛型推断 TypeScript 2.4围绕着泛型的推断方式引入了一些很棒的改变。 ## 返回类型作为推断目标 其一,TypeScript能够推断调用的返回值类型。这可以优化你的体验和方便捕获错误。如下所示: function0 码力 | 557 页 | 7.48 MB | 2 年前3
Go 2 Generics? A (P)reviewhttps://youtu.be/E16Y6bI2S08 Go 夜读 SIG 小组 | 第 80 期 March 18, 2020 ## 主要内容 - 泛型的起源 - 泛型的早期设计 - Go 2 的「合约」 - 上手时间 - 历史性评述 - 展望 ## 泛型的起源 Origin of Generics 多态是同一形式表现出不同行为的一种特性。在编程语言理论中被分为两类: 临时性多态(Ad 任意数量的调用。即泛型 func Add(a, b T) T{ return a+b } Add(1, 2) // 编译器生成 T = int 的 Add Add(float64(1.0), 2.0) // 编译器生成 T = float64 的 Add Add("1", "2") // 编译器生成 T = string 的 Add ## 泛型做到了什么接口做不到的事情? func Max(a, b T) T { ... } // T 是接口 当使用泛型时,a、b、返回值必须为同一类型,类型参数施加了这一强制性保障: func Max(a, b T) T { ... } // T 是类型参数 泛型的总体目标就是: 快且安全。在这里: 快 意味着静态类型 安全 意味着编译早期的错误甄别 ## 泛型的早期设计 Early Designs on Generics ##0 码力 | 41 页 | 770.62 KB | 2 年前3
MoonBit月兔编程语言 现代编程思想 第九课 接口
5. default() -> Self 6. } ## • 月兔中的接口是结构化的 ◦ 无需声明为特定的接口实现方法,类型本身实现方法即可 ## 接口 Trait • 我们可以在泛型的参数上添加接口的要求 ☐ 限制参数的类型: <类型参数> : <接口> ☐ 在函数中使用接口定义的方法: <类型参数>::<方法名> 1. fn0 码力 | 16 页 | 346.04 KB | 2 年前3
共 220 条
- 1
- 2
- 3
- 4
- 5
- 6
- 22













