Go 1.18 中的泛型interface contains type constraints func bar(T Ib[int]) {} // OK 为什么第二个 bar 不会报错? 13 抽象能力 泛型没有任何运行时的机制,所以关于泛型的组件只发生在编译时期 对于下面的接口而言,无法作为普通参数使用: func Foo[T any]() {} x := Foo // ERROR: cannot use { // ... } } 编译器无法提前得知是否 应该给 X 生成 Bar(int) 方法 类型集的本质 类型集的基本想法是设计一种能够表达一类类型的机制,这就是集合论的基本想法.设计这种机制的核心难点 是保证不会出现罗素悖论.例如不加以限制的 分类公理是朴素集合论中的导致矛盾的根源. 类型集可以从 ZF 系统来考虑: 外延公理:两个类型集相等,当且仅当他们包含的类型相同 https://go.dev/issue/47631 不能访问类型的结构字段 https://go.dev/issue/49030#issuecomment-954336867 41 更加高层的泛型机制同样不存在 42 特化 元编程 柯里化 非类型类型参数 运算符方法 ... 结论 43 类型参数更广泛的支持了基于接口的参数化多态 类型集使用了公理化集合论(更特别一点类型论)的方法扩展了接口的定义实现了类型约束0 码力 | 45 页 | 501.50 KB | 1 年前3
Go语言基础
Golang Fundaments参数类型在参数名的右边 • 支持多值返回 • 支持有名返回值 • 不支持函数重载(静态多态)。相同函数名不 同签名,会被认为函数重复定义 取消重载,避免编程时一个名字多种含义 变量定义与赋值 • 使用 var 关键字申明变量 • 不申明类型,则编译器采用表达式类型推导机制 – 第七行不申明 int,变量按又表达式确定类型 – 函数内可采用短赋值 := ,简化变量类型申明 – 第11行,var java0 码力 | 21 页 | 851.30 KB | 1 年前3
基于 mesos 的容器调度框架ACCEPT 消息: 接受此 o�er, 包括启动任务,预留资源等调度操作 DECLINE 消息: 明确拒绝此 o�er Filter : 可以设定资源的拒绝时间, 默认是 5s REVIVE 消息 : 取消之前设定 �lter 2017/8/3 基于 mesos 的容器调度框架 http://go-talks.appspot.com/github.com/huangnauh/slides/upone slide#3 24/36 高可用 通过 Raft 分布式一致性协议实现高可用 hashicorp/raft (https://github.com/hashicorp/raft) 领导选举: 心跳机制来触发选举, term 充当逻辑时钟的作用 日志复制: 领导者把一条指令(能被复制状态机执行)附加到日志中,发起附加条目 RPC 请求 给其他角色 强领导者:日志条目只从 leader 发送给其他的服务器0 码力 | 36 页 | 2.49 MB | 1 年前3
Go 入门指南(The way to Go)言的函数式和面向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第 9 章)。 在本书的第三部分,你将会学习到如何处理不同格式的文件(第 12 章)和如何在 Go 语言中巧妙地使用 错误处理机制(第 13 章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发 和多核应用的基本技巧的讲解(第 14 章)。最后,我们会讨论如何将 Go 语言应用到分布式和 CSP(通信序列进程 Communicating Squential Processes)理 论影响的 Limbo 和 Newsqueak 的实践中借鉴了一些经验,并使用了和 Erlang 类似的机制。 这是一门完全开源的编程语言,因为它使用 BSD 授权许可,所以任何人都可以进行商业软件的开发而不需 要支付任何费用。 尽管为了能够让目前主流的开发者们能够对 Go 语言中的类 C 语言的语法感到非常亲切而易于转型,但是 关系而使得构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖 关系分析系统从而能够快速编译的编程语言。这正是 Go 语言采用包模型的根本原因,这个模型通过严格 的依赖关系检查机制来加快程序构建的速度,提供了非常好的可量测性。 整个 Go 语言标准库的编译时间一般都在 20 秒以内,其它的常规项目也只需要半秒钟的时间来完成编译 工作。这种闪电般的编译速度甚至比编译 C 语言或者0 码力 | 380 页 | 2.97 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a将接口值视为用于包裹非接口值的盒子。 我发现将接口值视为用于包裹非 接口值的盒子对于清除很多和接口相关的困惑非常有帮助。 5. 澄清了Go白皮书中的一些含糊描述,包括内嵌规则、提升方法估值和恐慌/ 恢复机制。 6. 汇总了许多知识点和细节,从而可以帮助Go程序员节省很多学习时间。 有什么其它值得一提吗? 本书不涵盖自定义泛型相关内容。 请阅读《Go自定义泛型101》 一书来了解 使用自定义泛型。 除法 % 余数 两个运算数的类型必须相同并且为基本整数数值类型。 Go支持六种位运算符(也属于算术运算): 字 面 形 式 名称 对两个操作数的要求以及机制解释 & 位与 两个操作数的类型必须相同并且为基本整数数值类型。 机制解释(下标2表明一个字面量为二进制): 11002 & 10102 得到 10002 11002 | 10102 得到 11102 11002 ^ 10102 (注 意:在Go 1.13之前,右操作数必须为一个无符号整数类型的类 型确定值或者一个可以表示成uint值的类型不确定(第7章)常 数值。) 一个负右操作数(非常数)将在运行时刻造成一个恐慌。 机制解释: 11002 << 3 得到 11000002(低位补零) 11002 >> 3 得到 12(低位被舍弃) 注意,在右移运算中,左边空出来的位(即高位)全部用左操作 数的最高位(即正负号位)填充。0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a将接口值视为用于包裹非接口值的盒子。 我发现将接口值视为用于包裹 非接口值的盒子对于清除很多和接口相关的困惑非常有帮助。 5. 澄清了Go白皮书中的一些含糊描述,包括内嵌规则、提升方法估值和恐 慌/恢复机制。 6. 汇总了许多知识点和细节,从而可以帮助Go程序员节省很多学习时间。 有什么其它值得一提吗? 本书不涵盖自定义泛型相关内容。 请阅读《Go自定义泛型101》 ? 一书来了 解使用自定义泛型。 乘法 / 除法 % 余数 两个运算数的类型必须相同并且为基本整数数值类型。 Go支持六种位运算符(也属于算术运算): 字面形式 名称 对两个操作数的要求以及机制解释 & 位与 两个操作数的类型必须相同并且为基本整数数值类型。 机制解释(下标2表明一个字面量为二进制): 11002 & 10102 得到 10002 11002 | 10102 得到 11102 11002 ^ 10102 (注意:在Go 1.13之前,右操作数必须为一 个无符号整数类型的类型确定值或者一个可以表示成 uint值的类型不确定(第7章)常数值。) 一个负右操作数(非常数)将在运行时刻造成一个恐 慌。 机制解释: 11002 << 3 得到 11000002(低位补零) 11002 >> 3 得到 12(低位被舍弃) 注意,在右移运算中,左边空出来的位(即高位)全部 用左操作数的最高位(即正负号位)填充。0 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a将接口值视为用于包裹非接口值的盒子。 我发现将接口值视为用于包裹非接 口值的盒子对于清除很多和接口相关的困惑非常有帮助。 5. 澄清了Go白皮书中的一些含糊描述,包括内嵌规则、提升方法估值和恐慌/恢 复机制。 6. 汇总了许多知识点和细节,从而可以帮助Go程序员节省很多学习时间。 有什么其它值得一提吗? 本书不涵盖自定义泛型相关内容。 请阅读《Go自定义泛型101》 (https://gfw.go101 除法 % 余数 两个运算数的类型必须相同并且为基本整数数值类型。 Go支持六种位运算符(也属于算术运算): 字面形式 名称 对两个操作数的要求以及机制解释 & 位与 两个操作数的类型必须相同并且为基本整数数值类型。 机制解释(下标2表明一个字面量为二进制): 11002 & 10102 得到 10002 11002 | 10102 得到 11102 11002 ^ 10102 一个负右操作数(非常数)将在运行时刻造成一个恐慌。 机制解释: 11002 << 3 得到 11000002(低位补零) 11002 >> 3 得到 12(低位被舍弃) 注意,在右移运算中,左边空出来的位(即高位)全部用左操 作数的最高位(即正负号位)填充。 比如如果左操作数-128 第8章:运算操作符 52 字面形式 名称 对两个操作数的要求以及机制解释 的类型为int8(二进制补码表示为100000002),0 码力 | 591 页 | 21.40 MB | 1 年前3
Go 入门指南(The way to Go)的 CSP(通信序列进程 Communicating Squential Processes)理论影响的 Limbo 和 Newsqueak 的实践中借鉴了一些经验,并使用了和 Erlang 类似的机制。 这是一门完全开源的编程语言,因为它使用 BSD 授权许可,所以任何人都可以进行商业软件的开发而不需要支付任 何费用。 尽管为了能够让目前主流的开发者们能够对 Go 语言中的类 C 语言的语法感到非常亲切而易于转型,但是它在极大 构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖关系分析系统从而能够 快速编译的编程语言。这正是 Go 语言采用包模型的根本原因,这个模型通过严格的依赖关系检查机制来加快程序构 建的速度,提供了非常好的可量测性。 整个 Go 语言标准库的编译时间一般都在 20 秒以内,其它的常规项目也只需要半秒钟的时间来完成编译工作。这种 闪电般的编译速度甚至比编译 C 更加快,使得编译这一环节不再成为在软件开发中困扰开发人 员的问题。在这之前,动态语言将快速编译作为自身的一大亮点,像 C++ 那样的静态语言一般都有非常漫长的编译 和链接工作。而同样作为静态语言的 Go 语言,通过自身优良的构建机制,成功地去除了这个弊端,使得程序的构建 过程变得微不足道,拥有了像脚本语言和动态语言那样的高效开发的能力。 另外,Go 语言在执行速度方面也可以与 C/C++ 相提并论。 由于内存问题(通常称为内存泄漏)长期以来一直伴随着0 码力 | 466 页 | 4.44 MB | 1 年前3
Go Web编程游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打 算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻 量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生 了。 在本章中,我们将讲述Go的安装方法,以及如何配置项目信息。 目录 目录 links links 目录 符合Go的标准。 支持项目管理 21 图1.6 sublime项目管理界面 支持语法高亮 Sublime Text 2可免费使用,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式 注册版本没有任何区别。 接下来就开始讲如何安装,下载Sublime 根据自己相应的系统下载相应的版本,然后打开Sublime,对于不熟悉Sublime的同学可以先看一下这篇文章Sublime 参数值传递的 话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用 指针是一个明智的选择。 Go语言中string,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递 指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针) defer defer Go语言中有种不错的设计,即延迟(defer)语句0 码力 | 295 页 | 5.91 MB | 1 年前3
Go Context原理及其典型适用场景一个任务,需要多个goroutine完成 l 一个请求,会触发好多个goroutine做不同的事情 l 如果我们的任务终止了,请求取消了,这些正在运行 的goroutine怎么办? l 使用Context来简化这些操作 Context能做什么 u 手动、定时、超时发出取消信号 u 跨API传值 u 控制生成Context树结构(Context链) Context func main() { parent's children. func (c *cancelCtx) cancel(removeFromParent bool, err error) Context树结构 Context 取消控制 Ctx1 Ctx2 Ctx4 Ctx5 Ctx3 Ctx6 Thread Local Storage 存放线程独享的数据 ThreadLocal(Java) Goroutine Local0 码力 | 32 页 | 4.62 MB | 1 年前3
共 37 条
- 1
- 2
- 3
- 4













