 Go 入门指南(The way to Go)团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开 发了 UTF-8 字符集规范。自 2008 年 1 月起,Ken Thompson 就开始研发一款以 C 语言为目标结果的编 译器来拓展 Go 语言的设计思想。 这是一个由计算机领域 “发明之父” 所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非 常深刻的见解 图 1.1 Go 语言设计者:Griesemer、Thompson otour 进行 安装。 1.2 语言的主要特性与发展的环境和影响因素 1.2.1 影响 Go 语言发展的早期编程语言 1.2.2 为什么要创造一门编程语言 1.2.3 Go 语言的发展目标 1.2.4 指导设计原则 1.2.5 语言的特性 1.2.6 语言的用途 1.2.7 关于特性缺失 1.2.8 使用 Go 语言编程 1.2.9 小结 1.2.1 影响 Go 语言发展的早期编程语言 衡:快速编译,高效执行,易于开发。 1.2.3 Go 语言的发展目标 Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平 衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。 因此,Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进 行指针运算。 Go 语言的另一个目标是对于网络通信、并发和并行编程的极佳支持,从而更好地利用大量的分布式和多0 码力 | 380 页 | 2.97 MB | 1 年前3 Go 入门指南(The way to Go)团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开 发了 UTF-8 字符集规范。自 2008 年 1 月起,Ken Thompson 就开始研发一款以 C 语言为目标结果的编 译器来拓展 Go 语言的设计思想。 这是一个由计算机领域 “发明之父” 所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非 常深刻的见解 图 1.1 Go 语言设计者:Griesemer、Thompson otour 进行 安装。 1.2 语言的主要特性与发展的环境和影响因素 1.2.1 影响 Go 语言发展的早期编程语言 1.2.2 为什么要创造一门编程语言 1.2.3 Go 语言的发展目标 1.2.4 指导设计原则 1.2.5 语言的特性 1.2.6 语言的用途 1.2.7 关于特性缺失 1.2.8 使用 Go 语言编程 1.2.9 小结 1.2.1 影响 Go 语言发展的早期编程语言 衡:快速编译,高效执行,易于开发。 1.2.3 Go 语言的发展目标 Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平 衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。 因此,Go 语言是一门类型安全和内存安全的编程语言。虽然 Go 语言中仍有指针的存在,但并不允许进 行指针运算。 Go 语言的另一个目标是对于网络通信、并发和并行编程的极佳支持,从而更好地利用大量的分布式和多0 码力 | 380 页 | 2.97 MB | 1 年前3
 Go 入门指南(The way to Go)方法和格式化描述符 10.8 垃圾回收和 SetFinalizer 第11章:接口(interface)与反射(reflection) 11.1 接口是什么 11.2 接口嵌套接口 11.3 类型断言:如何检测和转换接口变量的类型 11.4 类型判断:type-switch 11.5 测试一个值是否实现了某个接口 11.6 使用方法集与接口 11.7 第一个例子:使用 Sorter 接口排序 11 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范。自 2008 年 1 月起,Ken Thompson 就开始研发一款以 C 语言为目标结果的编译器来拓展 Go 语言的设计思想。 这是一个由计算机领域 “发明之父” 所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非常深刻的见 解 图 1.1 Go 语言设计者:Griesemer、Thompson 语言在这 3 个条件之间做到了最佳的平衡:快速编译,高效执行,易 于开发。 Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程 变得更加有乐趣,而不是在艰难抉择中痛苦前行。 1.2.2 为什么要创造一门编程语言 1.2.3 Go 语言的发展目标 1.2 语言的主要特性与发展的环境和影响因素 - 19 - 本文档使用 书栈(BookStack0 码力 | 466 页 | 4.44 MB | 1 年前3 Go 入门指南(The way to Go)方法和格式化描述符 10.8 垃圾回收和 SetFinalizer 第11章:接口(interface)与反射(reflection) 11.1 接口是什么 11.2 接口嵌套接口 11.3 类型断言:如何检测和转换接口变量的类型 11.4 类型判断:type-switch 11.5 测试一个值是否实现了某个接口 11.6 使用方法集与接口 11.7 第一个例子:使用 Sorter 接口排序 11 团队成员,C 语言、Unix 和 Plan 9 的创始人之一,与 Rob Pike 共同开发了 UTF-8 字符集规范。自 2008 年 1 月起,Ken Thompson 就开始研发一款以 C 语言为目标结果的编译器来拓展 Go 语言的设计思想。 这是一个由计算机领域 “发明之父” 所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非常深刻的见 解 图 1.1 Go 语言设计者:Griesemer、Thompson 语言在这 3 个条件之间做到了最佳的平衡:快速编译,高效执行,易 于开发。 Go 语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程 变得更加有乐趣,而不是在艰难抉择中痛苦前行。 1.2.2 为什么要创造一门编程语言 1.2.3 Go 语言的发展目标 1.2 语言的主要特性与发展的环境和影响因素 - 19 - 本文档使用 书栈(BookStack0 码力 | 466 页 | 4.44 MB | 1 年前3
 3.云原生边云协同AI框架实践Incre- Training hard sample mining hard samples Labeling service labeling Model Mgmt 大模型 (安全帽检测) Models app local controller incremental learning Models Evaluation Sedna Incremental-Learning 更新边缘模型 边云协同增量学习: 小样本和非同分布下,模型越用越聪明 ① 开发者:导入边缘AI Lib库, 开发边云协同联邦学习程序。 ② 启动联邦学习任务,部署训练 程序到边缘 ③ 多任务检测,划分Non-IID样本集,与云端配合识别相似任务 ④ 本地训练,模型参数上传云端,云端运行跨边迁移+模型聚合算法。 Cloud EdgeNode 1 EdgeNode 2 Sedna Federated-Learning 任务失败等异常处理。 实践案例 第四部分 中国电信研究院园区ReID案例 场景描述 在给定视频中的第一帧和目标位置,实现目标检测、跟踪并预测其轨迹。 技术挑战 跨摄像头数据异构:摄像头拍摄的场景复杂,包括光照变化、遮挡严重、追 踪目标数量多等,单点的目标跟踪算法无法得到较好的效果。 业务收益 • 多目标跟踪准确度(MOTA)从70.6%提升到87.0% • 推理时延从21.2ms降低到18.5ms0 码力 | 37 页 | 2.36 MB | 1 年前3 3.云原生边云协同AI框架实践Incre- Training hard sample mining hard samples Labeling service labeling Model Mgmt 大模型 (安全帽检测) Models app local controller incremental learning Models Evaluation Sedna Incremental-Learning 更新边缘模型 边云协同增量学习: 小样本和非同分布下,模型越用越聪明 ① 开发者:导入边缘AI Lib库, 开发边云协同联邦学习程序。 ② 启动联邦学习任务,部署训练 程序到边缘 ③ 多任务检测,划分Non-IID样本集,与云端配合识别相似任务 ④ 本地训练,模型参数上传云端,云端运行跨边迁移+模型聚合算法。 Cloud EdgeNode 1 EdgeNode 2 Sedna Federated-Learning 任务失败等异常处理。 实践案例 第四部分 中国电信研究院园区ReID案例 场景描述 在给定视频中的第一帧和目标位置,实现目标检测、跟踪并预测其轨迹。 技术挑战 跨摄像头数据异构:摄像头拍摄的场景复杂,包括光照变化、遮挡严重、追 踪目标数量多等,单点的目标跟踪算法无法得到较好的效果。 业务收益 • 多目标跟踪准确度(MOTA)从70.6%提升到87.0% • 推理时延从21.2ms降低到18.5ms0 码力 | 37 页 | 2.36 MB | 1 年前3
 对 Go 程序进行可靠的性能测试○ 虚拟机或(共享)云服务器上可能受到宿主机资源分配等因素导致测量结果不稳定 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 性能基准测试的两个基本目标 6 可重复性:在其他外在条件不 变的情况下,性能度量 结果是稳定、可重复的(能复现的才叫 Bug) 可比较性:总是存在一个可以比较的基本线(有比较才有伤害) go test -bench RBTree_Put/size-900-8 217ns ± 0% 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 例 3:编译器优化 16 编译器优化产生的直接影响是测量的目标不准确,这一点在 C++ 编译器中相当 严重。编译器优化是一个比较大的话题,有很多可以深入讨论的内容,以后有机 会再表。只举比较简单的一例。comp1 和 comp2 一样快吗? func comp1(s1 Outliers in Univariate Data Sets, http://d-scholarship.pitt.edu/7948/1/Seo.pdf ○ 这篇论文比较了统计学中的一些异常值检测的方法 ● Mann, Henry B., and Donald R. Whitney. "On a test of whether one of two random variables is stochastically0 码力 | 37 页 | 1.23 MB | 1 年前3 对 Go 程序进行可靠的性能测试○ 虚拟机或(共享)云服务器上可能受到宿主机资源分配等因素导致测量结果不稳定 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 性能基准测试的两个基本目标 6 可重复性:在其他外在条件不 变的情况下,性能度量 结果是稳定、可重复的(能复现的才叫 Bug) 可比较性:总是存在一个可以比较的基本线(有比较才有伤害) go test -bench RBTree_Put/size-900-8 217ns ± 0% 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 例 3:编译器优化 16 编译器优化产生的直接影响是测量的目标不准确,这一点在 C++ 编译器中相当 严重。编译器优化是一个比较大的话题,有很多可以深入讨论的内容,以后有机 会再表。只举比较简单的一例。comp1 和 comp2 一样快吗? func comp1(s1 Outliers in Univariate Data Sets, http://d-scholarship.pitt.edu/7948/1/Seo.pdf ○ 这篇论文比较了统计学中的一些异常值检测的方法 ● Mann, Henry B., and Donald R. Whitney. "On a test of whether one of two random variables is stochastically0 码力 | 37 页 | 1.23 MB | 1 年前3
 Go Web编程按照其设计,Go打算为多核机器上系统软件的构造提供一种方法。 Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打 算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻 量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生 了。 在本章中,我们将讲述Go的安装方法,以及如何配置项目信息。 获取slice的长度 cap 获取slice的最大容量 append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数 注:append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。 但当slice中没有剩 余空间(即(cap-len) == 0 ActiveX或Flash以欺骗用户。一旦得手,他们可以盗 取用户帐户信息,修改用户设置,盗取/污染cookie和植入恶意广告等。 对XSS最佳的防护应该结合以下两种方法:一是验证所有输入数据,有效检测攻击(这个我们前面小节已经有过介绍); 另一个是对所有输出数据进行适当的处理,以防止任何已成功注入的脚本在浏览器端运行。 那么Go里面是怎么做这个有效防护的呢?Go的html/template里面带有下面几个函数可以帮你转义0 码力 | 295 页 | 5.91 MB | 1 年前3 Go Web编程按照其设计,Go打算为多核机器上系统软件的构造提供一种方法。 Go是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打 算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻 量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生 了。 在本章中,我们将讲述Go的安装方法,以及如何配置项目信息。 获取slice的长度 cap 获取slice的最大容量 append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数 注:append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。 但当slice中没有剩 余空间(即(cap-len) == 0 ActiveX或Flash以欺骗用户。一旦得手,他们可以盗 取用户帐户信息,修改用户设置,盗取/污染cookie和植入恶意广告等。 对XSS最佳的防护应该结合以下两种方法:一是验证所有输入数据,有效检测攻击(这个我们前面小节已经有过介绍); 另一个是对所有输出数据进行适当的处理,以防止任何已成功注入的脚本在浏览器端运行。 那么Go里面是怎么做这个有效防护的呢?Go的html/template里面带有下面几个函数可以帮你转义0 码力 | 295 页 | 5.91 MB | 1 年前3
 Golang 101(Go语言101 中文版)  v1.21.a结果为complex128类型的1.0+0.0i。虚部被舍入了。 complex128(1 + -1e-1000i) // 结果为float32类型的0.5。这里也舍入了。 float32(0.49999999) // 只要目标类型不是整数类型,舍入都是允许的。 float32(17000000000000000) float32(123) uint(1.0) int8(-123) int16(6+0i) complex128(789) 个空标识符。 内存地址(以及指针)和映射将在以后的文章中介绍。 常量是不可改变的(不可寻址的),所以常量不能做为目标值出现在纯赋值语 句的左边,而只能出现在右边用做源值。 变量既可以出现在纯赋值语句的左 边用做目标值,也可以出现在右边用做源值。 空标识符也可以出现在纯赋值语句的左边,表示不关心对应的目标值。 空标 识符不可被用做源值。 一个包含了很多(合法或者不合法的)纯赋值语句的例子: 1| const 每个局部声明的变量至少要被有效使用一次 注意,当使用目前的主流Go编译器编译Go代码时,一个局部变量被声明之后 至少要被有效使用一次,否则编译器将报错。 包级变量无此限制。 如果一个 变量总是被当作赋值语句中的目标值,那么我们认为这个变量没有被有效使用 过。 下面这个例子编译不通过。 1| package main 2| 3| var x, y, z = 123, true, "foo" // 包级变量0 码力 | 821 页 | 956.82 KB | 1 年前3 Golang 101(Go语言101 中文版)  v1.21.a结果为complex128类型的1.0+0.0i。虚部被舍入了。 complex128(1 + -1e-1000i) // 结果为float32类型的0.5。这里也舍入了。 float32(0.49999999) // 只要目标类型不是整数类型,舍入都是允许的。 float32(17000000000000000) float32(123) uint(1.0) int8(-123) int16(6+0i) complex128(789) 个空标识符。 内存地址(以及指针)和映射将在以后的文章中介绍。 常量是不可改变的(不可寻址的),所以常量不能做为目标值出现在纯赋值语 句的左边,而只能出现在右边用做源值。 变量既可以出现在纯赋值语句的左 边用做目标值,也可以出现在右边用做源值。 空标识符也可以出现在纯赋值语句的左边,表示不关心对应的目标值。 空标 识符不可被用做源值。 一个包含了很多(合法或者不合法的)纯赋值语句的例子: 1| const 每个局部声明的变量至少要被有效使用一次 注意,当使用目前的主流Go编译器编译Go代码时,一个局部变量被声明之后 至少要被有效使用一次,否则编译器将报错。 包级变量无此限制。 如果一个 变量总是被当作赋值语句中的目标值,那么我们认为这个变量没有被有效使用 过。 下面这个例子编译不通过。 1| package main 2| 3| var x, y, z = 123, true, "foo" // 包级变量0 码力 | 821 页 | 956.82 KB | 1 年前3
 Golang 101(Go语言101 中文版)  v1.21.a结果为complex128类型的1.0+0.0i。虚部被舍入了。 complex128(1 + -1e-1000i) // 结果为float32类型的0.5。这里也舍入了。 float32(0.49999999) // 只要目标类型不是整数类型,舍入都是允许的。 float32(17000000000000000) float32(123) uint(1.0) int8(-123) int16(6+0i) complex128(789) 个空标识符。 内存地址(以及指针)和映射将在以后的文章中介绍。 常量是不可改变的(不可寻址的),所以常量不能做为目标值出现在纯赋值语 句的左边,而只能出现在右边用做源值。 变量既可以出现在纯赋值语句的左边 用做目标值,也可以出现在右边用做源值。 空标识符也可以出现在纯赋值语句的左边,表示不关心对应的目标值。 空标识 符不可被用做源值。 一个包含了很多(合法或者不合法的)纯赋值语句的例子: const N 每个局部声明的变量至少要被有效使用一次 注意,当使用目前的主流Go编译器编译Go代码时,一个局部变量被声明之后至 少要被有效使用一次,否则编译器将报错。 包级变量无此限制。 如果一个变量 总是被当作赋值语句中的目标值,那么我们认为这个变量没有被有效使用过。 下面这个例子编译不通过。 package main var x, y, z = 123, true, "foo" // 包级变量 func main()0 码力 | 608 页 | 1.08 MB | 1 年前3 Golang 101(Go语言101 中文版)  v1.21.a结果为complex128类型的1.0+0.0i。虚部被舍入了。 complex128(1 + -1e-1000i) // 结果为float32类型的0.5。这里也舍入了。 float32(0.49999999) // 只要目标类型不是整数类型,舍入都是允许的。 float32(17000000000000000) float32(123) uint(1.0) int8(-123) int16(6+0i) complex128(789) 个空标识符。 内存地址(以及指针)和映射将在以后的文章中介绍。 常量是不可改变的(不可寻址的),所以常量不能做为目标值出现在纯赋值语 句的左边,而只能出现在右边用做源值。 变量既可以出现在纯赋值语句的左边 用做目标值,也可以出现在右边用做源值。 空标识符也可以出现在纯赋值语句的左边,表示不关心对应的目标值。 空标识 符不可被用做源值。 一个包含了很多(合法或者不合法的)纯赋值语句的例子: const N 每个局部声明的变量至少要被有效使用一次 注意,当使用目前的主流Go编译器编译Go代码时,一个局部变量被声明之后至 少要被有效使用一次,否则编译器将报错。 包级变量无此限制。 如果一个变量 总是被当作赋值语句中的目标值,那么我们认为这个变量没有被有效使用过。 下面这个例子编译不通过。 package main var x, y, z = 123, true, "foo" // 包级变量 func main()0 码力 | 608 页 | 1.08 MB | 1 年前3
 Go基础语法宝典slice 的最大容量 append 向 slice 里面追加一个或者多个元素,然后返回一个和 slice 一样类型的 slice copy 函数 copy 从源 slice 的 src 中复制元素到目标 dst ,并且返回复制的元素的个数 注: append 函数会改变 slice 所引用的数组的内容,从而影响到引用同一数组的其它 slice 。 但当 slice 中没有剩余空间(即 (cap-len) 1秒之后重试: 错误处理 Go在错误处理上采用了与C类似的检查返回值的方式,而不是其他多数主流语言采用的异常方式,这造 成了代码编写上的一个很大的缺点:错误处理代码的冗余,对于这种情况是通过复用检测函数来减少类似 的代码。 请看下面这个例子代码: if err := dec.Decode(&val); err != nil { if serr, ok := err.(*json log.Fatal(err) } func init() { http.HandleFunc("/view", viewRecord) 上面的例子中获取数据和模板展示调用时都有检测错误,当有错误发生时,调用了统一的处理函数 http.Error ,返回给客户端500错误码,并显示相应的错误数据。但是当越来越多的 HandleFunc 加入 之后,这样的错误处理逻辑代码就会0 码力 | 47 页 | 1020.34 KB | 1 年前3 Go基础语法宝典slice 的最大容量 append 向 slice 里面追加一个或者多个元素,然后返回一个和 slice 一样类型的 slice copy 函数 copy 从源 slice 的 src 中复制元素到目标 dst ,并且返回复制的元素的个数 注: append 函数会改变 slice 所引用的数组的内容,从而影响到引用同一数组的其它 slice 。 但当 slice 中没有剩余空间(即 (cap-len) 1秒之后重试: 错误处理 Go在错误处理上采用了与C类似的检查返回值的方式,而不是其他多数主流语言采用的异常方式,这造 成了代码编写上的一个很大的缺点:错误处理代码的冗余,对于这种情况是通过复用检测函数来减少类似 的代码。 请看下面这个例子代码: if err := dec.Decode(&val); err != nil { if serr, ok := err.(*json log.Fatal(err) } func init() { http.HandleFunc("/view", viewRecord) 上面的例子中获取数据和模板展示调用时都有检测错误,当有错误发生时,调用了统一的处理函数 http.Error ,返回给客户端500错误码,并显示相应的错误数据。但是当越来越多的 HandleFunc 加入 之后,这样的错误处理逻辑代码就会0 码力 | 47 页 | 1020.34 KB | 1 年前3
 Golang 101(Go语言101 中文版)  v1.21.a0+0.0i。虚部被舍入了。 complex128(1 + -1e-1000i) // 结果为float32类型的0.5。这里也舍入了。 float32(0.49999999) // 只要目标类型不是整数类型,舍入都是允许的。 float32(17000000000000000) float32(123) uint(1.0) int8(-123) int16(6+0i) 标识符。 内存地址(以及指针)和映射将在以后的文章中介绍。 常量是不可改变的(不可寻址的),所以常量不能做为目标值出现在纯赋值语句的 左边,而只能出现在右边用做源值。 变量既可以出现在纯赋值语句的左边用做目标 值,也可以出现在右边用做源值。 空标识符也可以出现在纯赋值语句的左边,表示不关心对应的目标值。 空标识符不 可被用做源值。 一个包含了很多(合法或者不合法的)纯赋值语句的例子: 1| const 每个局部声明的变量至少要被有效使用一次 注意,当使用目前的主流Go编译器编译Go代码时,一个局部变量被声明之后至少要 被有效使用一次,否则编译器将报错。 包级变量无此限制。 如果一个变量总是被 当作赋值语句中的目标值,那么我们认为这个变量没有被有效使用过。 下面这个例子编译不通过。 1| package main 2| 3| var x, y, z = 123, true, "foo" // 包级变量0 码力 | 591 页 | 21.40 MB | 1 年前3 Golang 101(Go语言101 中文版)  v1.21.a0+0.0i。虚部被舍入了。 complex128(1 + -1e-1000i) // 结果为float32类型的0.5。这里也舍入了。 float32(0.49999999) // 只要目标类型不是整数类型,舍入都是允许的。 float32(17000000000000000) float32(123) uint(1.0) int8(-123) int16(6+0i) 标识符。 内存地址(以及指针)和映射将在以后的文章中介绍。 常量是不可改变的(不可寻址的),所以常量不能做为目标值出现在纯赋值语句的 左边,而只能出现在右边用做源值。 变量既可以出现在纯赋值语句的左边用做目标 值,也可以出现在右边用做源值。 空标识符也可以出现在纯赋值语句的左边,表示不关心对应的目标值。 空标识符不 可被用做源值。 一个包含了很多(合法或者不合法的)纯赋值语句的例子: 1| const 每个局部声明的变量至少要被有效使用一次 注意,当使用目前的主流Go编译器编译Go代码时,一个局部变量被声明之后至少要 被有效使用一次,否则编译器将报错。 包级变量无此限制。 如果一个变量总是被 当作赋值语句中的目标值,那么我们认为这个变量没有被有效使用过。 下面这个例子编译不通过。 1| package main 2| 3| var x, y, z = 123, true, "foo" // 包级变量0 码力 | 591 页 | 21.40 MB | 1 年前3
 Go 2 Generics? A (P)review... } // T 是接口 当使用泛型时,a、b、返回值必须为同一类型,类型参数施加了这一强制性保障: func Max(a, b T) T { ... } // T 是类型参数 泛型的总体目标就是:快且安全。在 这里: 快 意味着静态类型 安全 意味着编译早期的错误甄别 泛型的早期设计 Early Designs on Generics 2020 © Changkun Ou vector { /*…*/ }; 不!如此要求用 户就会降低参数机制的灵活性,又不会使 实现变得简单,或使这种功能更安全……」 (1994 年)回头再看,我明白了 这些限制对于可读性和早期错误检测的重要性。』 ——"The Design and Evolution of C++" Chapter 15: Templates, 15.4 Constraints on Template Arguments0 码力 | 41 页 | 770.62 KB | 1 年前3 Go 2 Generics? A (P)review... } // T 是接口 当使用泛型时,a、b、返回值必须为同一类型,类型参数施加了这一强制性保障: func Max(a, b T) T { ... } // T 是类型参数 泛型的总体目标就是:快且安全。在 这里: 快 意味着静态类型 安全 意味着编译早期的错误甄别 泛型的早期设计 Early Designs on Generics 2020 © Changkun Ou vector { /*…*/ }; 不!如此要求用 户就会降低参数机制的灵活性,又不会使 实现变得简单,或使这种功能更安全……」 (1994 年)回头再看,我明白了 这些限制对于可读性和早期错误检测的重要性。』 ——"The Design and Evolution of C++" Chapter 15: Templates, 15.4 Constraints on Template Arguments0 码力 | 41 页 | 770.62 KB | 1 年前3
共 43 条
- 1
- 2
- 3
- 4
- 5














 
 