Golang 101(Go语言101 中文版) v1.21.a第29章:更多关于延迟函数调用的知识点 第30章:一些恐慌/恢复用例 第31章:详解panic/recover原理 - 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 第39章:其它并发同步技术 - 如何使用sync标准库包 第40章:原子操作 Println(p0) // (打印出一个十六进制形式的地址) fmt.Println(*p0) // 0 x := *p0 // x是p0所引用的值的一个复制。 p1, p2 := &x, &x // p1和p2中都存储着x的地址。 // x、*p1和*p2表示着同一个int值。 fmt Println(a) // 3 } 我们本期望上例中的double函数将变量a的值放大为原来的两倍,但是事实证明 我们的期望没有得到实现。 为什么呢?因为在Go中,所有的赋值(包括函数调 用传参)过程都是一个值复制过程。 所以在上面的double函数体内修改的是变 量a的一个副本,而没有修改变量a本身。 当然我们可以让double函数返回输入参数的两倍数,但是此方法并非适用于所 有场合。 下面这个例子通过将0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a第29章:更多关于延迟函数调用的知识点 第30章:一些恐慌/恢复用例 第31章:详解panic/recover原理 - 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 第39章:其它并发同步技术 - 如何使用sync标准库包 第40章:原子操作 Println(p0) // (打印出一个十六进制形式的地址) 8| fmt.Println(*p0) // 0 9| 10 | x := *p0 // x是p0所引用的值的一个复制。 11 | p1, p2 := &x, &x // p1和p2中都存储着x的地址。 12 | // x、*p1和*p2表示着同一个int值。 3 13 | } 我们本期望上例中的double函数将变量a的值放大为原来的两倍,但是事实证 明我们的期望没有得到实现。 为什么呢?因为在Go中,所有的赋值(包括函 数调用传参)过程都是一个值复制过程。 所以在上面的double函数体内修改 的是变量a的一个副本,而没有修改变量a本身。 当然我们可以让double函数返回输入参数的两倍数,但是此方法并非适用于所 有场合。 下面这个例子通0 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a第30章:一些恐慌/恢复用例 第31章:详解panic/recover原理 - 也解释了什么是“函数退出阶段” 第32章:代码块和标识符作用域 目录 2 第33章:表达式估值顺序规则 第34章:值复制成本 第35章:边界检查消除 并发编程 第36章:并发同步概述 第37章:通道用例大全 第38章:如何优雅地关闭通道 第39章:其它并发同步技术 - 如何使用sync标准库包 第40章:原子操作 // (打印出一个十六进制形式的地址) 8| fmt.Println(*p0) // 0 9| 10| x := *p0 // x是p0所引用的值的一个复制。 11| p1, p2 := &x, &x // p1和p2中都存储着x的地址。 12| // x、*p1和*p2表示着同一个int值。 3 13| } 我们本期望上例中的double函数将变量a的值放大为原来的两倍,但是事实证明我 们的期望没有得到实现。 为什么呢?因为在Go中,所有的赋值(包括函数调用传 参)过程都是一个值复制过程。 所以在上面的double函数体内修改的是变量a的 一个副本,而没有修改变量a本身。 当然我们可以让double函数返回输入参数的两倍数,但是此方法并非适用于所有场 合。 下面这个例子通0 码力 | 591 页 | 21.40 MB | 1 年前3
Go 入门指南(The way to Go)计算函数执行时间 6.12 通过内存缓存来提升性能 第7章:数组与切片 7.1 声明和初始化 7.2 切片 7.3 For-range 结构 7.4 切片重组(reslice) 7.5 切片的复制与追加 7.6 字符串、数组和切片的应用 第8章:Map 8.1 声明、初始化和 make 8.2 测试键值对是否存在及删除元素 8.3 for-range 的配套用法 8.4 map 类型的切片 址中(内存布局是连续的),这也是计算效率最高的一种 存储形式;也可以将这些字分散存放在内存中,每个字都指示了下一个字所在的内存地址。 当使用赋值语句 r2 = r1 时,只有引用(地址)被复制。 如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响。 在 Go 语言中,指针(第 4.9 节)属于引用类型,其它的引用类型还包括 slices(第 被调用 6.1 介绍 6.1 介绍 - 132 - 本文档使用 书栈(BookStack.CN) 构建 函数的形参(parameter,参考 第 6.2 节)。函数被调用的时候,这些实参将被复制(简单而言)然后传递给被 调用函数。函数一般是在其他函数里面被调用的,这个其他函数被称为调用函数(calling function)。函数能多 次调用其他函数,这些被调用函数按顺序(简单而言)执0 码力 | 466 页 | 4.44 MB | 1 年前3
Go 入门指南(The way to Go)存地址中(内存布局是连续的),这也是计算效率 最高的一种存储形式;也可以将这些字分散存放在内存中,每个字都指示了下一个字所在的内存地址。 当使用赋值语句 r2 = r1 时,只有引用(地址)被复制。 如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影 响。 在 Go 语言中,指针(第 4.9 节)属于引用类型,其它的引用类型还包括 slices(第 Function 是 pack1 包里面的一个函数,括号里的是被调用函数的实参(argument):这些值被传递 给被调用函数的形参(parameter,参考 第 6.2 节)。函数被调用的时候,这些实参将被复制(简单而 言)然后传递给被调用函数。函数一般是在其他函数里面被调用的,这个其他函数被称为调用函数 (calling function)。函数能多次调用其他函数,这些被调用函数按顺序(简单而言)执行,理论上,函 面添加&符号,比如 &variable)传递给函数,这就是按引用传递,比如 Function(&arg1) ,此时传递给 函数的是一个指针。如果传递给函数的是一个指针,指针的值(一个地址)会被复制,但指针的值所指向 的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。(* 译者注: 指针也是变量类型,有自己的地址和值,通常指针的值指向一个变量的地址。所以,按引用传递也是按值 传递。0 码力 | 380 页 | 2.97 MB | 1 年前3
Hello 算法 1.1.0 Go版据结构可 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: 第 4 章 数组与链表 hello‑algo.com 72 // === File: array.go === []int, enlarge int) []int { // 初始化一个扩展长度后的数组 res := make([]int, len(nums)+enlarge) // 将原数组中的所有元素复制到新数组 for i, num := range nums { res[i] = num } // 返回扩展后的新数组 return res } 4.1.2 数组的优点与局限性 数组0 码力 | 383 页 | 18.48 MB | 1 年前3
基于 mesos 的容器调度框架分布式一致性协议实现高可用 hashicorp/raft (https://github.com/hashicorp/raft) 领导选举: 心跳机制来触发选举, term 充当逻辑时钟的作用 日志复制: 领导者把一条指令(能被复制状态机执行)附加到日志中,发起附加条目 RPC 请求 给其他角色 强领导者:日志条目只从 leader 发送给其他的服务器 2017/8/3 基于 mesos 的容器调度框架 http://go-talks mesos 的容器调度框架 http://go-talks.appspot.com/github.com/huangnauh/slides/upone.slide#3 26/36 raft 日志复制 Image credit: the Raft paper (https://raft.github.io/raft.pdf) 2017/8/3 基于 mesos 的容器调度框架 http://go-talks0 码力 | 36 页 | 2.49 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Go 版以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 www.hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: 第 4 章 数组与链表 www.hello‑algo.com 72 // === File: array.go === []int, enlarge int) []int { // 初始化一个扩展长度后的数组 res := make([]int, len(nums)+enlarge) // 将原数组中的所有元素复制到新数组 for i, num := range nums { res[i] = num } // 返回扩展后的新数组 return res } 4.1.2 数组的优点与局限性 数组0 码力 | 384 页 | 18.49 MB | 10 月前3
Hello 算法 1.0.0 Golang版据结构可 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: 第 4 章 数组与链表 hello‑algo.com 72 // === File: array.go === []int, enlarge int) []int { // 初始化一个扩展长度后的数组 res := make([]int, len(nums)+enlarge) // 将原数组中的所有元素复制到新数组 for i, num := range nums { res[i] = num } // 返回扩展后的新数组 return res } 4.1.2 数组的优点与局限性 数组0 码力 | 382 页 | 17.60 MB | 1 年前3
使用Go与redis构建有趣的应用了命令请求的执⾏行行速度和效率 • 丰富的附加功能:事务、Lua 脚本、键过期机制、键淘汰机制、多种持久化⽅方式(AOF、RDB、 RDB+AOF 混合) • 强⼤大的多机功能⽀支持:主从复制(单主多从)、Sentinel(⾼高可⽤用)、集群(基于 Raft 算法,多 主多从,内建⾼高可⽤用) 特点 • 具有多种不不同的数据结构可⽤用,其中包括:字符串串、散列列、列列表、集合、有序集合、位图 了命令请求的执⾏行行速度和效率 • 丰富的附加功能:事务、Lua 脚本、键过期机制、键淘汰机制、多种持久化⽅方式(AOF、RDB、 RDB+AOF 混合) • 强⼤大的多机功能⽀支持:主从复制(单主多从)、Sentinel(⾼高可⽤用)、集群(基于 Raft 算法,多 主多从,内建⾼高可⽤用) • 拥有⽆无限可能性的扩展模块系统:神经⽹网络、全⽂文搜索、JSON 数据结构等等。 数据结构0 码力 | 176 页 | 2.34 MB | 1 年前3
共 22 条
- 1
- 2
- 3













