2.1.6 谈谈 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 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 i) {} 参数化多态(Parametric): templateT Add(T a, T b) { return a + b; } 子类型多态,行多态…: ’ alt=‘OCR图片’/> Go中的interface 鸭子定律: 当看到一个动物走起来像鸭子、游起来像鸭子、叫起来也像鸭子,那么这只动物就可以被称为鸭子。 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)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() Add() 的类型 if len(elem) == 0 { return } sum = elem[0] for _, v := range elem[1:] { sum = sum.Add(v) } return } 当使用类型参数作为函数的形参类型时,函数调用方传递的实际参数必须是满足类型参数所约束的类型: func GenericSum[S ~int](elem ~int](elem ...S) (sum S) { // S 的底层类型必须底层类型为 int 约束的类型 for i := range elements { sum += elem[i] } return } 使用泛型的根本目的是:类型安全的参数传递,以及对实现的类型进行抽象  ## 学习目标 ■ 理解泛型的概念,掌握其基本应用 ▶ 集合框架中的泛型 ▶ 泛型的向后兼容性 掌握自定义泛型类和泛型方法 ▶ 理解类型参数 ▶ 理解差异性并能够定义自己的泛型类和泛型方法 ▶ 受限制的类型参数 ■ 学会处理泛型类型,包括使用通配符实现泛型容器遍历和操作 ## 大纲 1 泛型概念 2 泛型类与泛型方法 3 处理泛型类型 ## 泛型概念 ## 什么是泛型 ## 泛型(Generics) 泛型机制自 JDK 5.0 开始引入,其实质是将原本确定不变的数据类型参数化。 作为对原有 Java 类型体系的扩充,使用泛型可以提高 Java 应用程序的类型安全、可维护性和可靠性。 ## 什么是泛型 ## ☑ 集合框架中的数据造型问题 传统的集合容器为了提供广泛的适用性,会将所有加入其中的元素当作 Object 类型来处理。基于此原因,在实际使用时,我们必须将从集合中取出的元素值再强制转换(造型)为所期望的类型。 ## 什么是泛型 ## 集合框架中的数据造型问题0 码力 | 35 页 | 587.40 KB | 2 年前3
TypeScript 类型系统## TypeScript 类型系统 分享人:陈文岗 学校:中国科学院大学 2021年1月21日 ## 关于TypeScript TypeScript是微软推出的JavaScript静态类型版本,它是JavaScript的超集,可以编译为纯粹的JavaScript TypeScript How Does TypeScript Work? TypeScript file.ts JavaScript jpg) ## TypeScript 基础类型 // 数字类型 let num: number; num = 123; // 布尔类型 let flag: boolean; flag = false; // 字符串类型 let str: string; str = 'Hello World'; ## TypeScript 高级类型 // 数组类型 let arr: number]; arr 'chenwengang', age: 23 }; // 函数类型/函数签名 type Callback = () => void; let cb:Callback = () => { console.log('callback'); }; ## TypeScript 高级类型 // 交叉类型 type User1 = { name: string;0 码力 | 25 页 | 1.27 MB | 2 年前3
MoonBit月兔编程语言 现代编程思想 第六课 泛型与高阶函数现代编程思想 # 泛型与高阶函数 Hongbo Zhang ## 设计良好的抽象 - 软件工程中,我们要设计良好的抽象 - 当代码多次重复出现 ☐ 当抽出的逻辑具有合适的语义 - 编程语言为我们提供了各种抽象的手段 - 函数、泛型、高阶函数、接口..... ## 泛型函数与泛型数据 ## 堆栈 - 栈是一个由一系列对象组成的一个集合,这些对象的插入和删除遵循后进先出原则(Last (Some(top), rest) 11. } 12. } ## • 我们希望存储很多很多类型在堆栈中 ☐ 每个类型都要定义一个对应的堆栈吗? ☐ IntStack 和 StringStack 似乎结构一模一样? ## 泛型数据结构与泛型函数 ## - 泛型数据结构与泛型函数以类型为参数,构建更抽象的结构 1. enum Stack[T] { 2. Empty 3. } 12. } • 将 T 替换为 Int 或 String 即相当于 IntStack 与 StringStack ## 泛型数据结构与泛型函数 • 我们用 <类型1>,<类型2>, $ \ldots $ 来定义泛型的类型参数 enum Stack[T]{ Empty; NonEmpty(T, Stack[T]) } o struct Pair[A, B]{0 码力 | 27 页 | 2.56 MB | 2 年前3
Mypy 1.10.0+dev Documentationtype Any are present within your codebase. ## --cobertura-xml-report DIR Causes mypy to generate a C键类型 XML type checking coverage report. To generate this report, you must either manually install the lxml are present within your codebase. cobertura_xml_report Type: string Causes mypy to generate a C键类型 XML type checking coverage report. To generate this report, you must either manually install the lxml0 码力 | 318 页 | 270.84 KB | 2 年前3
5 刘知杭 静态类型的Python## 静态类型的Python PYTHON 30th Lyzh(刘知杭) ## 目录 CONTENTS ➤ 有关类型的概念 使用mypy对Python源代码进行静态分析 代数数据类型 拓展知识 ## 关于类型的一些基本概念 有类型不等于有类型系统 PYTHON 30th 动态语言类型化的必要性 ## 不久前的一个案例 ☀️ ☀️ ☁️ rl = filter(lambda x: HttpResponse(json.dumps(rl), content_type='application/json') ## 类型的概念 CPython定义了PyObject这个结构体作为对象头。 CPython中的类型,是指在对象头中指向类型元信息的指针。 ## ●●● // cpython/include/object.h #define PyObject_HEAD PyObject CPython有类型,但CPython没有类型系统。这就是CsPython中诸多问题的由来。 ## 类型系统是什么? 类型系统(type system)是一种编译期(Compile-time)的类型推导检查规则。 类型系统(type system)的基本目标是防止程序在运行时发生类型错误。当且仅当语言运行时不存在任何形式的类型错误,那么它就是sound的。soundness是类型系统研究的重要目标。0 码力 | 42 页 | 6.87 MB | 2 年前3
Go 2 Generics? A (P)reviewMarch 18, 2020 ## 主要内容 - 泛型的起源 - 泛型的早期设计 - Go 2 的「合约」 - 上手时间 - 历史性评述 - 展望 ## 泛型的起源 Origin of Generics 多态是同一形式表现出不同行为的一种特性。在编程语言理论中被分为两类: 临时性多态(Ad hoc Polymorphism)根据实参类型调用对应的版本,仅支持数量有限的调用。也被翻译为特设多态。例如:函数重载 调用第二个 Add("1", "2") // 编译时不检查,运行时找不到实现,崩溃 参数化多态(Parametric Polymorphism)根据实参类型生成不同的版本,支持任意数量的调用。即泛型 func Add(a, b T) T{ return a+b } Add(1, 2) // 编译器生成 T = int 的 Add Add(float64(1.0), 2.0) = string 的 Add ## 泛型做到了什么接口做不到的事情? 当使用 interface{} 时,a、b、返回值都可以在运行时表现为不同类型,取决于内部实现如何对参数进行断言: type T interface { ... } func Max(a, b T) T { ... } // T 是接口 当使用泛型时,a、b、返回值必须为同一类型,类型参数施加了这一强制性保障: func0 码力 | 41 页 | 770.62 KB | 2 年前3
MoonBit月兔编程语言 现代编程思想 第九课 接口
# 现代编程思想 接口 Hongbo Zhang ## 回顾 ## • 第六课:定义平衡二叉树 我们定义一个更一般的二叉搜索树,允许存放任意类型的数据 1. enum Tree[T] { 2. Empty 3. Node(T, Tree[T], Tree[T]) 4. } 5. 6. // 我们需要一个比较函数来比较值的大小以了解顺序 7. // 负数表示小于,0表示等于,正数表示大于 第八课:定义循环队列 ☐ 我们需要类型的默认值来初始化数组 1. fn make[T](default: T) -> Queue[T] { 2. { array: Array::make(5, default), start: 0, end: 0, length: 0 } 3. } ## 方法 • 我们注意到一些与类型相关联的函数 ○ 类型的比较:fn T::compare(self: T::compare(self: T, other: T) -> Int ○ 类型的默认值: fn T::default() -> T ○ 类型的输出:fn T::to_string(self: T) -> String ☐ ..... • 我们将这类函数称为方法 ## 接口 Trait ## • 我们通过接口定义一系列方法的实现需求 1. trait Compare { 2. compare(Self0 码力 | 16 页 | 346.04 KB | 2 年前3
共 1000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 100













