Golang 101(Go语言101 中文版) v1.21.a
略微反直觉,甚至 自相矛盾。 Go语法和语义设计中有很多折衷和权衡。一个Go程序员需要相当 的Go编程经验和感悟才能理解这些权衡。 Go提供了几种基本但非必需的类型,比如切片,接口和通道。 Go编译器和运 行时在实现这些类型的时候,进行了必要的封装。 一方面,这些封装为Go编 程带来了许多便利,使我们不用从头实现这些类型。 但另一方面,这些封装 隐藏了这些类型的内部结构, 从而对我们更深入地理解这些类型的值的行为 它语言编程经验的程序员来说,读懂一份Go源码也不是一件难事。 目前,使用最广泛的Go编译器由Go官方设计和开发团队维护。 以后我们将称 此编译器为标准编译器。标准编译器也常常称为gc(是Go compiler的缩写, 不是垃圾回收garbage collection的缩写)。 Go官方设计和开发团队也维护着另 外一个编译器,gccgo。 gccgo是gcc编译器项目的一个子项目。 gccgo的使用 广泛度大不如gc, 。 目前两个编译器的开发都很活跃,尽管Go开发团队在gc的开发上花费的精力 更多。 gc编译器是Go官方工具链中一个组件。 Go官方工具链的使用将在下一篇文章 中介绍。 Go官方工具链1.0发布于2012年三月。 Go语言规范的最新版本和Go 官方工具链的最新版本总是保持一致。 每年Go官方工具链发行两个主版本。 自从Go语言正式发布后,Go的语法变化很小。 但是标准编译器gc却在不断地0 码力 | 821 页 | 956.82 KB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
略微反直觉,甚至自 相矛盾。 Go语法和语义设计中有很多折衷和权衡。一个Go程序员需要相当的 Go编程经验和感悟才能理解这些权衡。 Go提供了几种基本但非必需的类型,比如切片,接口和通道。 Go编译器和运 行时在实现这些类型的时候,进行了必要的封装。 一方面,这些封装为Go编程 带来了许多便利,使我们不用从头实现这些类型。 但另一方面,这些封装隐藏 了这些类型的内部结构, 从而对我们更深入地理解这些类型的值的行为带来了 它语言编程经验的程序员来说,读懂一份Go源码也不是一件难事。 目前,使用最广泛的Go编译器由Go官方设计和开发团队维护。 以后我们将称 此编译器为标准编译器。标准编译器也常常称为gc(是Go compiler的缩写,不 是垃圾回收garbage collection的缩写)。 Go官方设计和开发团队也维护着另外 一个编译器,gccgo。 gccgo是gcc编译器项目的一个子项目。 gccgo的使用广泛 度大不如gc, 它 性。 目前两 个编译器的开发都很活跃,尽管Go开发团队在gc的开发上花费的精力更多。 gc编译器是Go官方工具链中一个组件。 Go官方工具链的使用将在下一篇文章 中介绍。 Go官方工具链1.0发布于2012年三月。 Go语言规范的最新版本和Go官 方工具链的最新版本总是保持一致。 每年Go官方工具链发行两个主版本。 自从Go语言正式发布后,Go的语法变化很小。 但是标准编译器gc却在不断地 改进。0 码力 | 608 页 | 1.08 MB | 1 年前3Golang 101(Go语言101 中文版) v1.21.a
微反直觉,甚至自相矛盾。 Go 语法和语义设计中有很多折衷和权衡。一个Go程序员需要相当的Go编程经验和感悟 才能理解这些权衡。 Go提供了几种基本但非必需的类型,比如切片,接口和通道。 Go编译器和运行时在 实现这些类型的时候,进行了必要的封装。 一方面,这些封装为Go编程带来了许多 便利,使我们不用从头实现这些类型。 但另一方面,这些封装隐藏了这些类型的内 部结构, 从而对我们更深入地理解这些类型的值的行为带来了一些障碍。 验的程序员来说,读懂一份Go源码也不是一件难事。 目前,使用最广泛的Go编译器由Go官方设计和开发团队维护。 以后我们将称此编译 器为标准编译器。标准编译器也常常称为gc(是Go compiler的缩写,不是垃圾回 收garbage collection的缩写)。 Go官方设计和开发团队也维护着另外一个编译 器,gccgo。 gccgo是gcc编译器项目的一个子项目。 gccgo的使用广泛度大不 如gc, 器的开发都很活跃,尽管Go开发团队在gc的开发上花费的精力更多。 gc编译器是Go官方工具链中一个组件。 Go官方工具链的使用将在下一篇文章中介 绍。 Go官方工具链1.0发布于2012年三月。 Go语言规范的最新版本和Go官方工具链 的最新版本总是保持一致。 每年Go官方工具链发行两个主版本。 自从Go语言正式发布后,Go的语法变化很小。 但是标准编译器gc却在不断地改 进。 使用早期的gc编译的程序在运0 码力 | 591 页 | 21.40 MB | 1 年前3Go 入门指南(The way to Go)
语言设计者:Griesemer、Thompson 和 Pike Go入门指南 - 4 - 本文档使用 看云 构建 在 2008 年年中,Go 语言的设计工作接近尾声,一些员工开始以全职工作状态投入到这个项目的编译器 和运行实现上。Ian Lance Taylor 也加入到了开发团队中,并于 2008 年 5 月创建了一个 gcc 前端。 Russ Cox 加入开发团队后着手语言和类库方面的开发,也就是 Go 相互独立的。 Go 语言有一套完整的编码规范,你可以在 Go 语言编码规范 页面进行查看。 它不像 Ruby 那样通过实现过程来定义编码规范。作为一门具有明确编码规范的语言,它要求可以采用不 同的编译器如 gc 和 gccgo(第 2.1 节)进行编译工作,这对语言本身拥有更好的编码规范起到很大帮 助。 LALR 是 Go 语言的语法标准,你也可以在 src/cmd/internal/gc/go 出于隐私保护的考虑,许多公司的项目都没有展示在这个页面。我们将会在第 21 章讨论到一个使用 Go 语言开发的大型存储区域网络(SAN)案例。 在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl),这很可能会被用于在 Go入门指南 - 10 - 本文档使用 看云 构建 Chrome OS 中执行 Go 语言开发的应用程序。 Go 语言可以在 Intel 或 ARM0 码力 | 380 页 | 2.97 MB | 1 年前3Go 入门指南(The way to Go)
就开始研发一款以 C 语言为目标结果的编译器来拓展 Go 语言的设计思想。 这是一个由计算机领域 “发明之父” 所组成的黄金团队,他们对系统编程语言,操作系统和并行都有着非常深刻的见 解 图 1.1 Go 语言设计者:Griesemer、Thompson 和 Pike 在 2008 年年中,Go 语言的设计工作接近尾声,一些员工开始以全职工作状态投入到这个项目的编译器和运行实现 上。Ian Lance 立 的。 Go 语言有一套完整的编码规范,你可以在 Go 语言编码规范 页面进行查看。 它不像 Ruby 那样通过实现过程来定义编码规范。作为一门具有明确编码规范的语言,它要求可以采用不同的编译器 如 gc 和 gccgo(第 2.1 节)进行编译工作,这对语言本身拥有更好的编码规范起到很大帮助。 LALR 是 Go 语言的语法标准,你也可以在 src/cmd/internal/gc/go 页面进行查看。出于隐私保 护的考虑,许多公司的项目都没有展示在这个页面。我们将会在第 21 章讨论到一个使用 Go 语言开发的大型存储区 域网络(SAN)案例。 在 Chrome 浏览器中内置了一款 Go 语言的编译器用于本地客户端(NaCl),这很可能会被用于在 Chrome OS 中执行 Go 语言开发的应用程序。 Go 语言可以在 Intel 或 ARM 处理器上运行,因此它也可以在安卓系统下运行,例如0 码力 | 466 页 | 4.44 MB | 1 年前3对 Go 程序进行可靠的性能测试
RBTree_Put/size-900-8 217ns ± 0% 2020 © Changkun Ou · Go 夜读 · 对 Go 程序进行可靠的性能测试 例 3:编译器优化 16 编译器优化产生的直接影响是测量的目标不准确,这一点在 C++ 编译器中相当 严重。编译器优化是一个比较大的话题,有很多可以深入讨论的内容,以后有机 会再表。只举比较简单的一例。comp1 和 comp2 一样快吗? func comp1(s1 runtime.SetMaxHeap ○ 关闭无关程序和进程等等…… ❏ 确定测试代码的正确性 ○ 考虑 Goroutine 的终止性,当某些并发的工作发生在基准测试结束后,那么测量是不准确的 ○ 考虑编译器进行了过度优化或基准测试代码本身编写错误导致测量程序不正确 ❏ 实施性能基准测试 ○ (如果需要)计算需要采样的次数,否则推荐 20 次 ○ 使用 git stash 记录并撤销代码的修改,执行测试得到修改前的性能测试结果 主题 ● https://github.com/golang/go/issues/27400 ○ 这是一个未解决的 Issue,目的是希望 Go 团队能够在 testing 包中使用文档来说明编译器优化的情况,进而避免基准测试测量不准 确的问题 ● https://github.com/golang/go/issues/23471 ○ 这是一个未解决的 Issue,目的是希望 Go 团队能够发布一篇官方文档来详述如何科学的对0 码力 | 37 页 | 1.23 MB | 1 年前3Go 1.18 中的泛型
语言设计问题(运行时的类型断言),例如: func f(x any) { if _, ok := x.(interface{ Bar(int) }); ok { // ... } } 编译器无法提前得知是否 应该给 X 生成 Bar(int) 方法 类型集的本质 类型集的基本想法是设计一种能够表达一类类型的机制,这就是集合论的基本想法.设计这种机制的核心难点 是保证不会出现罗素悖论.例如不加以限制的 ConstraintA | ConstraintB // 并集 ConstraintMethodC() // 交集 } 这个问题是一个 NP 完全问题(Cook–Levin 定理)。 编译器在编译期间执行这类检查,如果不对规则加以限制,则将在某些情况下极大的增加 编译时间。 这最终导致了 "并集元素中不能包含具有方法集的参数 类型" 这一限制. Go 1.18 中的类型集设计并不是完备的,即某些类型集无法表示. 目前的泛型(1.18,但很可能在 1.20 之前都)还比较基础且限制较多(也不排除永远不会解除这些限制) 很多原因是权衡了编译器编译速度的结果(而非标新立异) 期待未来的改进空间 1. 取消前面提到的限制 2. 支持 parameterized aliases 3. 编译器改善 讨论 泛型在哪些基础库得到广泛应用? 泛型对于 Go 语言的简单性是一种破坏吗? 使用泛型会对性能有提升吗?0 码力 | 45 页 | 501.50 KB | 1 年前3Go 2 Generics? A (P)review
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 2020 © Changkun Ou · Go 夜读 · Go { 8 if fn(a, b) { 9 return a 10 } 11 return b 12 } 关键设计 ● 通过 //go:generate 编译器指示来自动生成代码 ● 利用这一特性比较优秀的实现是 cheekybits/genny 评述 ● 维护成本 ● 需要重新生成代 码 ● 没有类型检查,需要程序员自行判断 2020 © Changkun0 码力 | 41 页 | 770.62 KB | 1 年前35.cgo 原理解析及优化实践
十余年网关研发 • OpenResty 老司机(NGINX + LuaJIT) • MOSN 核心成员 • Envoy Golang extension maintainer • 玩过 DSL 编译器 • 对 LuaJIT、Go 有一些研究 目 录 背景介绍 01 cgo 工作机制 02 cgo 调度机制 03 CPU 优化 04 GC 优化 05 背景介绍 第一部分 网关发展历史 数据交互 抽象模型 1 2 3 对 PC 寄存器的修改 编译器完成地址指引 函数调用规约 Go 1.17 数据结构/类型 内存对象生命周期 GMP cgo 编译的两个阶段 cgo 预编译 常规编译 1 2 生成 wrapper 代码 屏蔽 GMP 模型 底层调用 C 编译器 链接器通过符号寻址 cgo 预编译 - C 调用 Go0 码力 | 45 页 | 5.74 MB | 1 年前3Go语言基础 Golang Fundaments
Design) • 并发软件设计(Concurrent Software Design) • 管道设计(Channel Design) Golang-设计哲学 • 实用主义的语言风格 – 面向编译器的静态类型语言 • 数据类型必须在编译阶段确定 • 语言能充分发挥编译优化技术 – 复古且简便的语言 • 集合了多种语言实用的语法表示 • 函数是一等公民(First-Class Functions) 取消重载,避免编程时一个名字多种含义 变量定义与赋值 • 使用 var 关键字申明变量 • 不申明类型,则编译器采用表达式类型推导机制 – 第七行不申明 int,变量按又表达式确定类型 – 函数内可采用短赋值 := ,简化变量类型申明 – 第11行,var java string = exp 强制编译器检查 exp为指定类型 • 变量定义不赋予值,则默认“零值” 变量能仅能是一种类型,除非显式转换0 码力 | 21 页 | 851.30 KB | 1 年前3
共 23 条
- 1
- 2
- 3