Golang 101(Go语言101 中文版) v1.21.astruct { 2| elements unsafe.Pointer // 引用着底层的元素 3| len int // 当前的元素个数 4| cap int // 切片的容量 5| } 从这个定义可以看出来,一个切片类型在内部可以看作是一个指针包裹类型。 每个非零切片值包含着一个底层间接部分用来存储此切片的元素。 片值的容量 有实际意义。 我们可以调用内置函数len来获取一个容器值的长度,或者调用内置函数cap 来获取一个容器值的容量。 这两个函数都返回一个int类型确定结果值或者一 个默认类型为int的类型不确定结果,具体取决于传递给它们的实参是否为常 量表达式。 因为非零映射值的容量是无限大,所以cap并不适用于映射值。 一个数组值的长度和容量永不改变。同一个数组类型的所有值的长度和容量都 总是和此数组类型的长度相等。 Println(len(a), cap(a)) // 5 5 8| var s []int 9| fmt.Println(len(s), cap(s)) // 0 0 10 | s, s2 := []int{2, 3, 5}, []bool{} 11 | fmt.Println(len(s), cap(s), len(s2), cap(s2)) // 3 3 0 00 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.atype _slice struct { elements unsafe.Pointer // 引用着底层的元素 len int // 当前的元素个数 cap int // 切片的容量 } 从这个定义可以看出来,一个切片类型在内部可以看作是一个指针包裹类型。 每个非零切片值包含着一个底层间接部分用来存储此切片的元素。 一个切片值 切片值的容量有实 际意义。 我们可以调用内置函数len来获取一个容器值的长度,或者调用内置函数cap来 获取一个容器值的容量。 这两个函数都返回一个int类型确定结果值或者一个 默认类型为int的类型不确定结果,具体取决于传递给它们的实参是否为常量表 达式。 因为非零映射值的容量是无限大,所以cap并不适用于映射值。 一个数组值的长度和容量永不改变。同一个数组类型的所有值的长度和容量都 总是和此数组类型的长度相等。 [5]int fmt.Println(len(a), cap(a)) // 5 5 var s []int fmt.Println(len(s), cap(s)) // 0 0 s, s2 := []int{2, 3, 5}, []bool{} fmt.Println(len(s), cap(s), len(s2), cap(s2)) // 3 3 0 0 var m map[int]bool0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.astruct { 2| elements unsafe.Pointer // 引用着底层的元素 3| len int // 当前的元素个数 4| cap int // 切片的容量 5| } 第17章:值部 139 从这个定义可以看出来,一个切片类型在内部可以看作是一个指针包裹类型。 每个 非零切片值包含 切片值的容量有实际意义。 我们可以调用内置函数len来获取一个容器值的长度,或者调用内置函数cap来获 取一个容器值的容量。 这两个函数都返回一个int类型确定结果值或者一个默认类 型为int的类型不确定结果,具体取决于传递给它们的实参是否为常量表达式。 因 为非零映射值的容量是无限大,所以cap并不适用于映射值。 一个数组值的长度和容量永不改变。同一个数组类型的所有值的长度和容量都总是 Println(len(a), cap(a)) // 5 5 8| var s []int 9| fmt.Println(len(s), cap(s)) // 0 0 10| s, s2 := []int{2, 3, 5}, []bool{} 11| fmt.Println(len(s), cap(s), len(s2), cap(s2)) // 3 3 0 00 码力 | 591 页 | 21.40 MB | 1 年前3
Hello 算法 1.0.0b4 Golang版为两步:首先统计操作数量,然后判断渐近上界。 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以被忽略。根据此原则,可以总结出以下计数简化技巧: 1. 忽略与 ? 无关的操作。因为它们都是 ?(?) 中的常数项,对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 对数字的引用。因此,我们会发现两个数组中的相同数字拥有同一个 id ,并且这些数字的内 存地址是无需连续的。 70 5. 栈与队列 5.1. 栈 「栈 Stack」是一种遵循先入后出(First In, Last Out)原则的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子,如果需要拿出底部的盘子,则需要先将上面的盘子依次取出。我们 将盘子替换为各种类型的元素(如整数、字符、对象等),就得到了栈数据结构。 在栈 len(stack) /* 判断是否为空 */ isEmpty := len(stack) == 0 5.1.2. 栈的实现 为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和 删除元素,因此栈可以被视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无 关操作,使其对外表现的逻辑符合栈的特性。0 码力 | 347 页 | 27.40 MB | 1 年前3
Go 入门指南(The way to Go)安装。 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 语言发展的早期编程语言 Go入门指南 go install 能够很轻松地对第三方包进行部署。 此外,Go 语言还支持调用由 C 语言编写的海量库文件(第 3.9 节),从而能够将过去开发的软件进行快 速迁移。 1.2.4 指导设计原则 Go语言通过减少关键字的数量(25 个)来简化编码过程中的混乱和复杂度。干净、整齐和简洁的语法也 能够提高程序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。 这些方面 语言在函数式编程 方面的基本概念。 Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非 常快。 作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。 Go 语言其实也有一些动态语言的特性(通过关键字 var ),所以它对那些逃离 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript0 码力 | 380 页 | 2.97 MB | 1 年前3
Hello 算法 1.1.0 Go版”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。根据此原则,可以总结出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 len(stack) /* 判断是否为空 */ isEmpty := len(stack) == 0 5.1.2 栈的实现 为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和 删除元素,因此栈可以视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无关 操作,使其对外表现的逻辑符合栈的特性。0 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0 Golang版”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。根据此原则,可以总结出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 len(stack) /* 判断是否为空 */ isEmpty := len(stack) == 0 5.1.2 栈的实现 为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和 删除元素,因此栈可以视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无关 操作,使其对外表现的逻辑符合栈的特性。0 码力 | 382 页 | 17.60 MB | 1 年前3
Go 入门指南(The way to Go)法也能够提高程 序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。 这些方面的工作都是为了减少编码的工作量,甚至可以与 Java 的简化程度相比较。 1.2.4 指导设计原则 1.2 语言的主要特性与发展的环境和影响因素 - 20 - 本文档使用 书栈(BookStack.CN) 构建 Go 语言有一种极简抽象艺术家的感觉,因为它只提供了一到两种方法来解决某个问题,这使得开发者们的代码都非常 Go 语言在函数式编程方面的基本 概念。 Go 语言使用静态类型,所以它是类型安全的一门语言,加上通过构建到本地代码,程序的执行速度也非常快。 作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。 Go 语言其实也有一些动态语言的特性(通过关键字 var ),所以它对那些逃离 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript 5 节),它们的作用都将在接下来的章节中进行进一步地讲解。 4.1 文件名、关键字与标识符 - 54 - 本文档使用 书栈(BookStack.CN) 构建 append bool byte cap close complex complex64 complex128 copy false float32 float64 imag int int8 int16 int32 int64 iota0 码力 | 466 页 | 4.44 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Go 版”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。根据此原则,可以总结出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 len(stack) /* 判断是否为空 */ isEmpty := len(stack) == 0 5.1.2 栈的实现 为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和 删除元素,因此栈可以视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无关 操作,使其对外表现的逻辑符合栈的特性。0 码力 | 384 页 | 18.49 MB | 10 月前3
Hello 算法 1.0.0b5 Golang版。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以被忽略。根据此原则,可以总结出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 len(stack) /* 判断是否为空 */ isEmpty := len(stack) == 0 5.1.2 栈的实现 为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和 删除元素,因此栈可以被视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无 关操作,使其对外表现的逻辑符合栈的特性。 时,软件需要在栈底(即队首)执行删除操作。但栈无法实现该功能,此时就需要使用双向队列来替代栈。 请注意,“撤销”的核心逻辑仍然遵循栈的先入后出原则,只是双向队列能够更加灵活地实现一些额外逻辑。 5.4 小结 1. 重点回顾 ‧ 栈是一种遵循先入后出原则的数据结构,可通过数组或链表来实现。 ‧ 从时间效率角度看,栈的数组实现具有较高的平均效率,但在扩容过程中,单次入栈操作的时间复杂度 会降低至0 码力 | 379 页 | 30.70 MB | 1 年前3
共 32 条
- 1
- 2
- 3
- 4













