golang
文章平均质量分 96
简单的土拨鼠
欢迎大家关注,微信公众号:简单的土拨鼠,
展开
-
一文掌握 Go 内存对齐
例如,对于一个 32 位的整数,如果存储在非 4 字节对齐的地址上,可能需要两次内存读取操作才能获取完整的数据,而在对齐的地址上,一次读取操作即可。内存对齐是一种将数据在内存中进行排列的方式,目的是提高内存访问的效率和保证数据的完整性。数据的内存排列方式最直观的体现就是数据的内存地址,说白了就是数据的内存地址要符合一定规则,以便于CPU读取,这个规则就是下面要讲的内存对齐规则。上面的输出和我们的结论是契合的,内存地址都是对齐值的倍数,另外还有一点,为了减少内存开销,编译器还会优化内存布局,减少内存碎片。原创 2024-08-23 13:40:49 · 1011 阅读 · 0 评论 -
深入理解 Go 数组、切片、字符串
如果我们不知道数组中元素的数量,访问时可能发生越界;Go 语言切片可以看做对数组的封账,Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。使用copy()内置函数拷贝两个切片时,会将源切片的数据逐个拷贝到目的切片指向的数组中,拷贝数量取两个切片长度的最小值,例如长度为10的切片拷贝到长度为5的切片时,将会拷贝5个元素,也就是说,copy过程中不会发生扩容。原创 2024-07-31 13:00:01 · 321 阅读 · 0 评论 -
深入理解 go map
介绍了哈希表在计算机科学中的重要性以及哈希表的设计和实现。哈希表是一种用于维护集合数据并支持增删查改操作的数据结构,其性能取决于哈希函数和冲突解决方法的选择。哈希函数的输出范围应该大于输入范围,以尽可能均匀地分布哈希结果,从而减少哈希冲突和提高读写性能。冲突解决方法包括开放寻址法和拉链法,开放寻址法通过遍历数组来查找目标键值对,而拉链法则通过使用链表来解决哈希冲突。哈希表的内存模型包括桶和键值对,桶内最多可存储 8 个键值对,当桶已满时,需要创建新的桶来存储更多的键值对。在创建 map 时,可以使用语法`m原创 2024-07-10 19:48:24 · 1137 阅读 · 0 评论 -
深入理解 go unsafe
Go 是支持指针的语言,但是为了保持简洁、安全,Go 的指针有很多限制,但是一些场景又需要绕过这些安全限制,因此提供了 unsafe 包,unsafe 可以绕过:指针运算、不同的指针类型不能转换、任意类型指针等限制,进而可以实现更高级的功能。例如,如果 x 是一个切片,那么 Sizeof 返回的是切片描述符的大小,而非切片所引用的内存的大小。使用 unsafe 包时需要非常谨慎,因为不正确的使用可能会导致程序出现难以调试的错误,甚至破坏程序的稳定性和安全性,应仅在有充分理由和完全理解其风险的情况下使用。原创 2024-08-15 20:23:21 · 797 阅读 · 0 评论 -
深入 go interface 底层原理
fun 字段则是一个动态大小的函数指针数组,当fun[0]=0时,表示_type并没有实现该接口(这里指的是itab下的_type),当实现了接口时,fun存放了第一个接口方法的地址,其他方法依次往后存放。对于接口判断 == nil 时,只有接口所指向的类型和值都为 nil 时接口才为 nil,如果想比较准确的判断接口类型是否是 nil 可以使用反射实现,但是有一定性能开销。提高代码的灵活性和可维护性:当低层模块的实现发生变化时,高层模块不需要进行大量的修改,只需要更改依赖的抽象的实现即可。原创 2024-07-31 12:44:56 · 461 阅读 · 0 评论 -
深入理解 go reflect
反射的核心原理就是检查和操作变量的类型、值,Go 的反射通过 reflect.TypeOf() 、reflect.ValueOf() 来返回类型和值的相关信息,它们的返回值reflect.Type、reflect.Value 是实现反射的核心。Go 的函数参数是值传递,所以调用 reflect.ValueOf 时对 x 进行了拷贝,v 是由 x 的副本转换来的,v 并没有保存原始对象 x 的相关信息,所以 v 是不可以被设置的。可设置性是反射对象的一个属性,其本质是反射对象有没有保存原始的对象。原创 2024-08-07 14:00:24 · 893 阅读 · 0 评论 -
深入理解 go context
context 是 Go 语言中用于处理并发操作的一个重要概念。context也被称作上下文,主要用于在 goroutine 之间传递截止日期、取消信号和其他请求范围的值。Deadline(): 返回与 Context 关联的截止时间。如果没有设置截止时间,则返回 zero time.Time 和 false。Done(): 返回一个 channel,当 Context 被取消或者截止时间到达时,该 channel 会被关闭。Err(): 返回 Context 被取消的原因。原创 2024-07-31 12:47:57 · 141 阅读 · 0 评论 -
Go 常用关键字
1. 本文介绍了 Go 语言中的三个关键字:make、new 和 defer,以及它们的作用和使用场景。2. 详细介绍了 Go 语言中的 panic 和 recover 机制,包括它们的作用、使用方法和注意事项。3. 最后,文章还介绍了 Go 语言中的 for range 循环语句,以及它在不同数据类型上的遍历过程和注意事项。原创 2024-07-10 19:45:19 · 571 阅读 · 0 评论