Golang 101(Go语言101 中文版) v1.21.aGo语言中有三种基本的流程控制代码块: if-else条件分支代码块; for循环代码块; switch-case多条件分支代码块。 Go中另外还有几种和特定种类的类型相关的流程控制代码块: 容器类型(第18章)相关的for-range循环代码块。 接口类型(第23章)相关的type-switch多条件分支代码块。 通道类型(第21章)相关的select-case多分支代码块。 和很多其它流行语言一样,G Go所支持的六种流程控制代码块中,除了if-else条件分支代码块,其它五种 称为可跳出代码块。 我们可以在一个可跳出代码块中使用break语句以跳出此 代码块。 我们可以在for和for-range两种循环代码块中使用continue语句提前结束一个 循环步。 除了这两种循环代码块,其它四种代码块称为分支代码块。 请注意,上面所提及的每种流程控制的一个分支都属于一条语句。这样的语句 常常会包含很多子语句。 if-else条件分支控制代码块 一个if-else条件分支控制代码块的完整形式如下: if InitSimpleStatement; Condition { // do something } else { // do something } if和else是两个关键字。 和很多其它编程语言一样,else分支是可选的。 在一个if-else条件分支控制代码块中, I0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.aGo语言中有三种基本的流程控制代码块: if-else条件分支代码块; for循环代码块; switch-case多条件分支代码块。 Go中另外还有几种和特定种类的类型相关的流程控制代码块: 容器类型(第18章)相关的for-range循环代码块。 接口类型(第23章)相关的type-switch多条件分支代码块。 通道类型(第21章)相关的select-case多分支代码块。 和很多其它流行语言一样,G Go所支持的六种流程控制代码块中,除了if-else条件分支代码块,其它五种 称为可跳出代码块。 我们可以在一个可跳出代码块中使用break语句以跳出此 代码块。 我们可以在for和for-range两种循环代码块中使用continue语句提前结束一 个循环步。 除了这两种循环代码块,其它四种代码块称为分支代码块。 请注意,上面所提及的每种流程控制的一个分支都属于一条语句。这样的语句 常常会包含很多子语句。 if-else条件分支控制代码块 一个if-else条件分支控制代码块的完整形式如下: 1| if InitSimpleStatement; Condition { 2| // do something 3| } else { 4| // do something 5| } if和else是两个关键字。 和很多其它编程语言一样,else分支是可选的。 在一个if-else条件分支控制代码块中,0 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.aGo语言中有三种基本的流程控制代码块: if-else条件分支代码块; for循环代码块; switch-case多条件分支代码块。 Go中另外还有几种和特定种类的类型相关的流程控制代码块: 容器类型(第18章)相关的for-range循环代码块。 接口类型(第23章)相关的type-switch多条件分支代码块。 通道类型(第21章)相关的select-case多分支代码块。 和很多其它流行语言一样,G Go所支持的六种流程控制代码块中,除了if-else条件分支代码块,其它五种称为 可跳出代码块。 我们可以在一个可跳出代码块中使用break语句以跳出此代码块。 我们可以在for和for-range两种循环代码块中使用continue语句提前结束一个 循环步。 除了这两种循环代码块,其它四种代码块称为分支代码块。 请注意,上面所提及的每种流程控制的一个分支都属于一条语句。这样的语句常常 会包含很多子语句。 技术(第36章)属于广义上的流程控制语句。 本文余下的部分将只解释三种基本的流程控制语句和各种代码跳转语句。其它上面 提及的语句将在后面其它文章中逐渐介绍。 if-else条件分支控制代码块 第12章:基本流程控制语法 82 一个if-else条件分支控制代码块的完整形式如下: 1| if InitSimpleStatement; Condition { 2| // do something 3|0 码力 | 591 页 | 21.40 MB | 1 年前3
Go 入门指南(The way to Go)17 - 本文档使用 看云 构建 7. 更新版本 你可以在 发布历史 页面查看到最新的稳定版。 当前最新的稳定版 Go 1 系列于 2012 年 3 月 28 日发布。 Go 的源代码有以下三个分支: - Go release:最新稳定版,实际开发最佳选择 - Go weekly:包含最近更新的版本,一般每周更新一次 - Go tip:永远保持最新的版本,相当于内测版 当你在使用不同的版本 main() 函数开始执行,然后按顺序执行该函数体中的代码。 但我们经常会需要只有在满足一些特定情况时才执行某些代码,也就是说在代码里进行条件判断。针对这 种需求,Go 提供了下面这些条件结构和分支结构: if-else 结构 switch 结构 select 结构,用于 channel 的选择(第 14.4 节) 可以使用迭代或循环结构来重复执行一次或多次某段代码(任务): for 如果存在第二个分支,则可以在上面代码的基础上添加 else 关键字以及另一代码块,这个代码块中的代码 只有在条件不满足时才会执行。if 和 else 后的两个代码块是相互独立的分支,只可能执行其中一个。 if condition { // do something } else { // do something } 如果存在第三个分支,则可以使用下面这种三个独立分支的形式:0 码力 | 380 页 | 2.97 MB | 1 年前3
Go 入门指南(The way to Go)go1.4.2 或类似字符串。 7. 更新版本 你可以在 发布历史 页面查看到最新的稳定版。 当前最新的稳定版 Go 1 系列于 2012 年 3 月 28 日发布。 Go 的源代码有以下三个分支: Go release:最新稳定版,实际开发最佳选择 Go weekly:包含最近更新的版本,一般每周更新一次 Go tip:永远保持最新的版本,相当于内测版 当你在使用不同的版本时,注意 main() 函数开始执行,然后按顺序执行该函数体中的代码。但我们 经常会需要只有在满足一些特定情况时才执行某些代码,也就是说在代码里进行条件判断。针对这种需求,Go 提供了 下面这些条件结构和分支结构: if-else 结构 switch 结构 select 结构,用于 channel 的选择(第 14.4 节) 可以使用迭代或循环结构来重复执行一次或多次某段代码(任务): for if condition { 2. // do something 3. } 如果存在第二个分支,则可以在上面代码的基础上添加 else 关键字以及另一代码块,这个代码块中的代码只有在条 件不满足时才会执行。if 和 else 后的两个代码块是相互独立的分支,只可能执行其中一个。 1. if condition { 2. // do something0 码力 | 466 页 | 4.44 MB | 1 年前3
Hello 算法 1.0.0b4 Golang版preOrderIII(root.Right, res, path) // 回退 *path = (*path)[:len(*path)-1] } 剪枝是一个非常形象的名词。在搜索过程中,我们“剪掉”了不满足约束条件的搜索分支,避免许多无意义 的尝试,从而实现搜索效率的提高。 Figure 13‑3. 根据约束条件剪枝 13.1.3. 框架代码 接下来,我们尝试将回溯的“尝试、回退、剪枝”的主体框架提炼出来,提升代码的通用性。 ‧ 遍历选择列表 choices 时,跳过所有已被选择过的节点,即剪枝。 如下图所示,假设我们第一轮选择 1 ,第二轮选择 3 ,第三轮选择 2 ,则需要在第二轮剪掉元素 1 的分支, 在第三轮剪掉元素 1, 3 的分支。 Figure 13‑6. 全排列剪枝示例 观察上图发现,该剪枝操作将搜索空间大小从 ?(??) 降低至 ?(?!) 。 代码实现 想清楚以上信息之后,我们就可以在框架 去重。然而这样做不够优 雅,因为生成重复排列的搜索分支是没有必要的,应当被提前识别并剪枝,这样可以进一步提升算法效率。 相等元素剪枝 观察发现,在第一轮中,选择 1 或选择 ̂1 是等价的,在这两个选择之下生成的所有排列都是重复的。因此应 该把 ̂1 剪枝掉。 同理,在第一轮选择 2 后,第二轮选择中的 1 和 ̂1 也会产生重复分支,因此也应将第二轮的 ̂1 剪枝。 本质上看,我们的0 码力 | 347 页 | 27.40 MB | 1 年前3
Golang 入门笔记并且在目录下执行 go mod init 程序流程控制 程序流程控制的基本介绍 在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要是有三大流程控制语句。 1. 顺序控制 2. 分支控制 3. 循环控制 循环语句 for 循环 举个例子 循环嵌套 循环控制 break continue 语句 goto 语句 无限循环 条件语句 if 语句 if .. else int = 10 fmt.Println(num4); 分支控制 介绍:让程序有选择的执行。有下面三种形式 1. 单分支 基本语法 if 条件语句 { //执行代码块 } 说明:当前体哦傲剑表达式为 true 的时候,就会执行 {} 内的代码,注意 {} 必须是有的,就算你只写一行代码。 案例代码 2. 双分支 基本语法 if 条件语句 { //执行代码块1 } } else { //执行代码块2 } 说明:当前条件成立,即执行代码块1, 否则执行代码块 2,{} 也是必须有的。 3. 多分支 循环控制 运算符 逻辑运算的基本细节 1. && 也叫短路与; 如果第一个条件为 false , 则第二个条件不会判断,最终结果为 false 2. || 也叫做短路或, 如果第一个条件为 true , 则第二个条件也不会判断, 最终结果为 true0 码力 | 2 页 | 511.29 KB | 1 年前3
Hello 算法 1.1.0 Go版f(n-2) res := fib(n-1) + fib(n-2) // 返回结果 f(n) return res } 观察以上代码,我们在函数内递归调用了两个函数,这意味着从一个调用产生了两个调用分支。如图 2‑6 所 示,这样不断递归调用下去,最终将产生一棵层数为 ? 的递归树(recursion tree)。 图 2‑6 斐波那契数列的递归树 从本质上看,递归体现了“将问题分解为更小子 ,? 指向首个小于 target 的元素,因此索引 ? 就是插入点。 图 10‑6 二分查找重复元素的插入点的步骤 第 10 章 搜索 hello‑algo.com 216 观察以下代码,判断分支 nums[m] > target 和 nums[m] == target 的操作相同,因此两者可以合并。 即便如此,我们仍然可以将判断条件保持展开,因为其逻辑更加清晰、可读性更好。 // === 时,跳过所有已被选择的节点,即剪枝。 如图 13‑6 所示,假设我们第一轮选择 1 ,第二轮选择 3 ,第三轮选择 2 ,则需要在第二轮剪掉元素 1 的分 支,在第三轮剪掉元素 1 和元素 3 的分支。 图 13‑6 全排列剪枝示例 观察图 13‑6 发现,该剪枝操作将搜索空间大小从 ?(??) 减小至 ?(?!) 。 第 13 章 回溯 hello‑algo.com 287 2. 代码实现0 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0 Golang版f(n-2) res := fib(n-1) + fib(n-2) // 返回结果 f(n) return res } 观察以上代码,我们在函数内递归调用了两个函数,这意味着从一个调用产生了两个调用分支。如图 2‑6 所 示,这样不断递归调用下去,最终将产生一棵层数为 ? 的「递归树 recursion tree」。 图 2‑6 斐波那契数列的递归树 从本质上看,递归体现了“将问题分解为更小 ,? 指向首个小于 target 的元素,因此索引 ? 就是插入点。 第 10 章 搜索 hello‑algo.com 217 图 10‑6 二分查找重复元素的插入点的步骤 观察以下代码,判断分支 nums[m] > target 和 nums[m] == target 的操作相同,因此两者可以合并。 即便如此,我们仍然可以将判断条件保持展开,因为其逻辑更加清晰、可读性更好。 // === 时,跳过所有已被选择的节点,即剪枝。 如图 13‑6 所示,假设我们第一轮选择 1 ,第二轮选择 3 ,第三轮选择 2 ,则需要在第二轮剪掉元素 1 的分 支,在第三轮剪掉元素 1 和元素 3 的分支。 图 13‑6 全排列剪枝示例 观察图 13‑6 发现,该剪枝操作将搜索空间大小从 ?(??) 减小至 ?(?!) 。 第 13 章 回溯 hello‑algo.com 289 2. 代码实现0 码力 | 382 页 | 17.60 MB | 1 年前3
Hello 算法 1.0.0b5 Golang版f(n-2) res := fib(n-1) + fib(n-2) // 返回结果 f(n) return res } 观察以上代码,我们在函数内递归调用了两个函数,这意味着从一个调用产生了两个调用分支。如图 2‑6 所 示,这样不断递归调用下去,最终将产生一个层数为 ? 的「递归树 recursion tree」。 图 2‑6 斐波那契数列的递归树 本质上看,递归体现“将问题分解为更小子问 ,? 指向首个小于 target 的元素,因此索引 ? 就是插入点。 第 10 章 搜索 hello‑algo.com 212 图 10‑6 二分查找重复元素的插入点的步骤 观察以下代码,判断分支 nums[m] > target 和 nums[m] == target 的操作相同,因此两者可以合并。 即便如此,我们仍然可以将判断条件保持展开,因为其逻辑更加清晰、可读性更好。 // === res, path) // 回退 *path = (*path)[:len(*path)-1] } 剪枝是一个非常形象的名词。如图 13‑3 所示,在搜索过程中,我们“剪掉”了不满足约束条件的搜索分支, 避免许多无意义的尝试,从而提高了搜索效率。 图 13‑3 根据约束条件剪枝 13.1.3 框架代码 接下来,我们尝试将回溯的“尝试、回退、剪枝”的主体框架提炼出来,提升代码的通用性。 在以下框架代码中,state0 码力 | 379 页 | 30.70 MB | 1 年前3
共 18 条
- 1
- 2













