golang
文章平均质量分 86
golang
蔡蔡开始内卷
这个作者很懒,什么都没留下…
展开
-
sync.map
go 里面提供了map这种类型让我们可以存储键值对数据,但是如果我们在并发的情况下使用map的话,就会发现它是不支持并发地进行读写的(会报错)。在这种情况下,我们可以使用sync.Mutex来保证并发安全,但是这样会导致我们在读写的时候,都需要加锁,这样就会导致性能的下降。我们知道,Golang原生的map是的,如果你硬要用多个goroutine并发读写map,会得到 panic。对此常见的解决方案有两种。原创 2023-09-06 14:37:31 · 238 阅读 · 0 评论 -
go-泛型提升篇(三)
前面的文章介绍了泛型的基础语法和使用要注意的地方。现在来看看泛型的优化方式。接口有一般接口和基本接口。一般接口不能用于定义类型遍历,只能用与约束。泛型类型要使用的话必须传入类型实参实例化才有意义。泛型不能与匿名方法或者函数一起使用泛型不能与类型断言起使用。原创 2022-10-20 20:28:43 · 765 阅读 · 0 评论 -
golang-泛型基础篇(二)
在上一篇文章中介绍了 golang中泛型的定义,泛型结构体,部分错误的泛型写法。匿名结构体不支持泛型。原因(个人理解):定义泛型,相当于定义新的类型,然后对其进行初始化。使用匿名结构体时,定义好匿名结构体之后直接初始化,相当于每次定义一个新的结构体类型进行初始化。不太符合泛型的要求。Go的泛型(或者或类型形参)目前可使用在3个地方泛型类型 - 类型定义中带类型形参的类型泛型receiver- 泛型类型的receiver泛型函数 - 带类型形参的函数没有匿名的泛型类型(匿名结构体,匿名方法)原创 2022-10-19 17:39:01 · 1974 阅读 · 0 评论 -
golang-泛型基础篇(一)
/ 这里传入了类型实参int,泛型类型SliceT[T]被实例化为具体的类型 Slice[int] var a SliceT [ int ] = [ ] int {1 , 2 , 3 } fmt . Printf("Type Name: %T\n" , a) //输出:Type Name: Slice[int] // 传入类型实参float32, 将泛型类型SliceT[T]实例化为具体的类型 Slice[string] var b SliceT [ float32 ] = [ ] float32 {原创 2022-10-18 16:02:51 · 2735 阅读 · 0 评论 -
高频问题-逃逸分析
写过C/C++的同学都知道,调用著名的malloc和new函数可以在堆上分配一块内存,这块内存的使用和销毁的责任都在程序员。一不小心,就会发生内存泄露。切换到Golang后,基本不会担心内存泄露了。虽然也有new函数,但是使用new函数得到的内存不一定就在堆上。一个变量是在堆上分配,还是在栈上分配,是经过编译器的逃逸分析之后得出的结论。Go语言逃逸分析最基本的原则是:如果一个函数返回对一个变量的引用,那么它就会发生逃逸。在编译原理中,分析指针动态范围的方法称之为逃逸分析。通俗来讲,当一个对象的指针被。原创 2022-10-18 11:12:56 · 238 阅读 · 0 评论 -
go-内存管理篇(二) 万字总结-golang内存分配篇
本文是讲解Golang内存管理的第二篇,在第一篇中我们提到,Golang的内存分配模式与TCMalloc是极其相似的。所以先来回顾一下TCMalloc相关知识点。Page:TCMalloc也是以页为单位管理内存 默认8KB。Span:TCMalloc是以Span为单位向操作系统申请内存的,由一组连续的Page组成。Size Class:由Span分裂出的对象,由同一个Span分裂出的SizeClass大小相同,SizeClass是对象内存实际的载体。原创 2022-10-17 16:54:23 · 4527 阅读 · 0 评论 -
go-你不知道的内存对齐
总结- 内存对齐是为了让 cpu 更高效访问内存中数据unsafe.Sizeof(x) 返回了变量x的内存占用大小;两个结构体,即使包含变量类型的数量相同,但是位置不同,占用的内存大小也不同,由此引出了内存对齐;内存对齐包含成员对齐和整体对齐,与 unsafe.AlignOf(x) 息息相关;空结构体作为成员变量时,要避免作为 struct 最后一个字段,会有内存浪费;原创 2022-10-14 15:14:49 · 350 阅读 · 0 评论 -
go-内存管理篇(一) TCMalloc
当存储的东西越来越多,也就发现物理内存的容量依然是不够用,那么对物理内存的利用率和合理的分配,管理就变得非常的重要。内部碎片:TCMalloc提前分配了多种size-class:8, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176…获取,实则是从FreeList中返回一个空闲的对象,如果对应的Size Class刻度下已经没有空闲的Span可以被获取了,则。进行合并,这里的相同就是指分配的对象大小相同,取一个碎片更少的size进行使用。是对象内存实际的载体。原创 2022-10-13 17:08:53 · 1003 阅读 · 0 评论 -
golang-值接收者和指针接收者的区别
方法能给用户自定义的类型添加新的行为。它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接收者,也可以是指针接收者。在调用方法的时候,值类型既可以调用值接收者**的方法,也可以调用**指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用**值接收者**的方法。原创 2022-08-24 20:17:39 · 877 阅读 · 1 评论 -
golang-内存管理-GC回收
go 1.5 采用三色标记法,插入写屏障机制(只在堆内存中生效),最后仍需对栈内存进行STW;go 1.8 采用混合写屏障机制,屏障限制只在堆内存中生效。避免了最后节点对栈进行STW的问题,提升了GC效率;插入写屏障没有完全保证完整的强三色不变式(栈对象的影响),所以赋值器是灰色赋值器,最后必须 STW 重新扫描栈;混合写屏障消除了所有的 STW,实现的是黑色赋值器,不用 STW 扫描栈;混合写屏障的精度和删除写屏障的一致,比以前插入写屏障要低;原创 2022-08-22 16:21:17 · 2065 阅读 · 1 评论 -
你不看就会后悔的【golang -channel 】!!!!
Go依赖于成为CSP的并发模型,通过Channel实现这种同步模式。golang 的哲学是通过 channel 进行协程(goroutine)之间的通信来实现数据共享。CSP 模型是“以通信的方式来共享内存”,不同于传统的多线程通过共享内存来通信。用于描述两个独立的并发实体通过共享的通讯 channel (管道)进行通信的并发模型。这种方式的优点是通过提供原子的通信原语,避免了竞态情形(race condition)下复杂的锁机制。对 channel 的操作行为结果总结(重点)操作closepanic。原创 2022-08-19 19:57:22 · 243 阅读 · 0 评论 -
go-map数据类型详解
声明 & 初始化mapmap是一个拥有键值对元素的无序集合。在这个集合中,键的值是唯一的,键对应的值可以通过键来获取、更新或移除。在 Go 语言中, map是散列表的引用, map的类型是map[K]V ,其中 K 和 V 是字典的键和值对应的数据类型。map 中所有的键都拥有相同的数据类型,同时所有的值也都拥有相同的数据类型,但是键的类型和值的类型不一定相同。键的类型 K ,必须是可以通过操作符==来进行比较的数据类型,所以 map 可以检测某一个键是否已经存在。...原创 2022-08-09 10:33:07 · 1074 阅读 · 0 评论 -
go-slice切片大全
创建切片时可根据实际需要预分配容量,尽量避免追加过程中扩容操作,有利于提升性能切片拷贝时需要判断实际拷贝的元素个数谨慎使用多个切片操作同一个数组,以防读写冲突每个切片都指向一个底层数组每个切片都保存了当前切片的长度、底层数组可用容量使用len()、cap()计算切片长度、容量时,时间复杂度均为O(1),不需要遍历切片通过函数传递切片时,不会拷贝整个切片,因为切片本身只是个结构体而矣使用 append() 向切片追加元素时有可能触发扩容,扩容后将会生成新的切片。......原创 2022-08-05 10:46:29 · 446 阅读 · 0 评论 -
golang -数据类型
1,复合类型,只有每个元素(成员)可比较,而且类型和值都相等时,两个复合元素才相等2,slice,map不可比较,但是可以用reflect或者cmp包来比较3,func作为golnag的一等公民,也是一个类型,也不能比较。4,引用类型的比较是看指向的是不是同一个变量5,类型再定义(type A string)不可比较,是两种不同的类型6,类型别名(type A = string)可比较,是同一种类型。类型别名类型别名需要在别名和原类型之间加上赋值符号 = ,使用。...原创 2022-08-04 17:18:10 · 270 阅读 · 0 评论 -
golang-常量(const和itoa)
分析:a3的值为100,因为itoa计数在a0被赋值100后,后续常量的值以字面值常量100为准,但是itoa计数器还在计数,只是没有赋值给常量,需要显示的通过iota恢复。常量是只读,声明赋值后无法修改,变量可以重复修改其内容值。常量:常量标识恒定不变的值,区别于变量var。var-变量不赋值存在默认值,但是常量声明是必须显示赋值。3.iota作用于itoa使用前的最近的const,如果itoa后续后又出现const。在同一个常量组里,可以再多个常量定义中使用iota,多个常量按照列单独计数。...原创 2022-08-04 14:46:53 · 997 阅读 · 0 评论 -
go语言的接口
一.其他语言其他语言中所提供的接口概念:接口主要作为不同组件之间的契约存在。对契约的实现是强制的(侵入式接口),你必须声明你的确实现了该接口。为了实现一个接口,你需要从该接口继承。interface IFoo {void Bar();}// Java文法 // ...class Foo implements IFoo {}// C++文法 // ...class Foo : public IFoo {} “侵入式”的主要表现在于实现类需要明确声明自己实...原创 2021-08-31 20:25:34 · 250 阅读 · 3 评论