包含标签 源码分析 的文章

深入理解 Go defer

在上一章节 《深入理解 Go panic and recover》中,我们发现了 defer 与其关联性极大,还是觉得非常有必要深入一下。希望通过本章节大家可以对 defer 关键字有一个深刻的理解,那么我们开始吧。你先等等,请排好队,我们这儿采取后进先出 LIFO 的出站方式… 特性 我们简单的过一下 defer 关键字的基础使用,让大……

阅读全文

深入理解 Go panic and recover

作为一个 gophper,我相信你对于 panic 和 recover 肯定不陌生,但是你有没有想过。当我们执行了这两条语句之后。底层到底发生了什么事呢?前几天和同事刚好聊到相关的话题,发现其实大家对这块理解还是比较模糊的。希望这篇文章能够从更深入的角度告诉你为什么,它到底做了什么事? 思考 一、为什么会中止运行……

阅读全文

为什么遍历 Go map 是无序的

有的小伙伴没留意过 Go map 输出顺序,以为它是稳定的有序的;有的小伙伴知道是无序的,但却不知道为什么?有的却理解错误?今天我们将通过本文,揭开 for range map 的 “神秘” 面纱,看看它内部实现到底是怎么样的,输出顺序到底是怎么样? 前言 1 2 3 4 5 6 7 8 9 10 11 12 func main() { m := make(map[int32]string) m[0] = "zshipu1" m[1] = "zshipu2" m[2] = "zshipu3" m[3] = "zshipu4" m[4] = "zshipu5"……

阅读全文

深入理解 Go map:赋值和扩容迁移

概要 在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重点内容。我相信这样你能更好的读懂这篇文章 哈希函数 哈希函数,又称散列算法、散列函数。主要作用是通过特定算法将数据根据一……

阅读全文

深入理解 Go map:初始化和访问元素

从本文开始咱们一起探索 Go map 里面的奥妙吧,看看它的内在是怎么构成的,又分别有什么值得留意的地方? 第一篇将探讨初始化和访问元素相关板块,咱们带着疑问去学习,例如: 初始化的时候会马上分配内存吗? 底层数据是如何存储的? 底层是如何使用 key 去寻找数据的? 底层是用什么方式解决哈希冲突的? 数据类型……

阅读全文

Go Slice 最大容量大小是怎么来的

前言 在《深入理解 Go Slice》中,我们提到了 “根据其类型大小去获取能够申请的最大容量大小” 的处理逻辑。今天我们将更深入地去探究一下,底层到底做了什么东西,涉及什么知识点? Go Slice 对应代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 func makeslice(et *_type, len, cap int) slice { maxElements := maxSliceCap(et.size) if len < 0 || uintptr(len) > maxElements { ... } if cap < len || uintptr(cap) > maxElements { ... }……

阅读全文

有点不安全却又一亮的 Go unsafe.Pointer

在上一篇文章《深入理解 Go Slice》中,大家会发现其底层数据结构使用了 unsafe.Pointer。因此想着再介绍一下其关联知识 前言 在大家学习 Go 的时候,肯定都学过 “Go 的指针是不支持指针运算和转换” 这个知识点。为什么呢? 首先,Go 是一门静态语言,所有的变量都必须为标量类型。不同的……

阅读全文

深入理解 Go Slice

是什么 在 Go 中,Slice(切片)是抽象在 Array(数组)之上的特殊类型。为了更好地了解 Slice,第一步需要先对 Array 进行理解。深刻了解 Slice 与 Array 之间的区别后,就能更好的对其底层一番摸索 😄 用法 Array 1 2 3 4 5 6 7 8 9 10 func main() { nums := [3]int{} nums[0] = 1 n := nums[0] n = 2 fmt.Printf("nums: %v\n", nums) fmt.Printf("n: %d\n", n) } 我们可得知在 Go 中,数组类型需……

阅读全文

fmt 标准库 --- Print* 是怎么样输出的?

前言 package main import ( "fmt" ) func main() { fmt.Println("Hello World!") } 标准开场见多了,那内部标准库又是怎么输出这段英文的呢?今天一起来围观下源码吧 🤭 原型 func Print(a ...interface{}) (n int, err error) { return Fprint(os.Stdout, a...) } func Println(a ...interface{}) (n int, err error) { return Fprintln(os.Stdout, a...) } func Printf(format string, a ...interface{}) (n int, err error) { return Fprintf(os.Stdout, format, a...) } Print:使用默认格式说明符打印格式并写入标准输出。当两者都不是字符串时,在操作数之间添加……

阅读全文

log 标准库

日志 输出 2018/09/28 20:03:08 zshipu Blog... 构成 [日期]<空格>[时分秒]<空格>[内容]<\n> 源码剖析 Logger type Logger struct { mu sync.Mutex prefix string flag int out io.Writer buf []byte } mu:互斥锁,用于确保原子的写入 prefix:每行需写入的日志前缀内容 flag:设置日志辅助信息(时间、文件名、行号)的写入。可选如下……

阅读全文