golang杂谈
关于golang的一些,较认真总结
CJ-cooper
go figjting!
展开
-
GO语言heap剖析
GO语言heap剖析本节内容heap使用heap提供的方法heap源码剖析利用heap实现优先级队列1. heap使用在go语言的标准库container中,实现了三中数据类型:heap,list,ring,list在前面一篇文章中已经写了,现在要写的是heap(堆)的源码剖析。首先,学会怎么使用heap,第一步当然是导入包了,代码如下:package mainimport ( "container/heap" "fmt")这个堆使用的数据结构是最小二叉树,即根节点比左边转载 2021-11-04 18:37:34 · 359 阅读 · 0 评论 -
Go语言性能优化建议
slice预分配内存尽可能在使用make()初始化切片时提供容量信息如果在后续使用过程中切片容量不够了,会重新用一个新的数组做底层数组,造成性能开销。另一个陷阱:大内存未释放使用切片表达式(类似:arr[low:high]),在已有切片基础上创建切片,不会创建新的底层数组而是会复用原来切片的底层数组。会出现两个问题:原切片较大,代码在原切片的基础上新建小切片。之后使用这个小切片实际上还是使用原先大切片底层数组,性能不高原底层数组在内存中有引用,得不到释放解决方法就是可以使用copy函数原创 2022-05-29 23:00:46 · 505 阅读 · 0 评论 -
go实现两个协程交替打印
方法一:使用两个channel这里channel CA 必须要有缓冲区,否则最后会报错 fatal error: all goroutines are asleep - deadlock!这是因为无缓冲的通道只有在有接收方能够接收值的时候才能发送成功,否则会一直处于等待发送的阶段。因为最后交替运行完后没有协程可以接收CA通道中的数据,所以会一直阻塞发生死锁package mainimport ( "fmt" "sync")var wg sync.WaitGroupvar CA cha原创 2022-03-24 13:47:28 · 2053 阅读 · 1 评论 -
Go语言 内存逃逸 内存溢出 内存泄漏
内存逃逸内存分配有两种方式 : 堆分配 和 栈分配内存逃逸 :Go中程序变量会携带一组校验数据,用来证明它的整个生命周期在程序运行时是否完全可知。如果变量通过了这些校验,它就可以在栈上分配,反之就可以说它逃逸了,这时就必须在堆上分配。这样做虽然浪费堆空间,但是有效避免了悬挂指针的出现,并且由于GC的存在也不会出现内存泄漏,权衡之下也是一种合理的做法。出现内存逃逸的情况:指针逃逸在方法内把局部变量指针返回时,会出现内存逃逸。因为局部变量原本应该在栈上分配,并且在栈中回收,但是由于在返回时被外原创 2021-12-28 19:51:21 · 2202 阅读 · 0 评论 -
Go语言力扣常用函数
Go语言力扣常用函数将字符串全部变成小写:s=strings.ToLower(arr)最大值:math.MaxInt32将字符串变成int数字 strconv.Atoi(res) 如:”2“ -> 2将int数字变成字符串 strconv.Itoa(res)原创 2021-12-26 23:48:35 · 531 阅读 · 0 评论 -
Go语言 nil 切片和空切片解析
var a1 []int //nil切片a2 := []int{} //空切片,或者用 make([]int,0)空切片和nil切片指向的地址不一样nil切片引用数组指针地址为0(没有指向任何实际地址)空切片有引用数组指针地址,并且是固定的一个值func main() {var a []intb:=[]int{}c:=[]int{}fmt.Printf("%p %p %p",a,b,c)}//输出0x0 0x34ea90 0x34ea90...原创 2021-12-24 13:51:36 · 838 阅读 · 0 评论 -
go语言 切片表达式
切片表达式 切片的底层就是一个数组,所以我们可以基于数组通过切片表达式得到切片。 切片表达式中的low和high表示一个索引范围(左包含,右不包含),得到的切片长度=high-low,容量等于得到的切片的底层数组的容量。同时a[2:] 等同于 a[2:len(a)]a[:3] 等同于 a[0:3]a[:] 等同于 a[0:len(a)]总结基于数组通过切片表达式得到切片左包含,右不包含...原创 2021-04-19 19:56:53 · 223 阅读 · 0 评论 -
Go语言 判断key是否在map里 if _, ok := map[key]; ok
if val, ok := map[key]; ok { //do something here}如果key在map里 val 被赋值key ok 是true 否则val得到相应类型的零值;ok是false原创 2021-03-29 15:11:07 · 2589 阅读 · 2 评论 -
Golang ---rune
byte 等同于int8,常用来处理ascii字符rune等同于int32,rune 只是 int32的别名,常用来处理unicode或utf-8字符//可以处理中文在使用上,rune能处理一切的字符,而byte仅仅局限在asciiunicode:统一码,也叫万国码,是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。...原创 2021-11-10 21:19:54 · 95 阅读 · 0 评论 -
gorm设置utf8
err:=db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").AutoMigrate(&Admin{},&Student{},&Interview{}).Error原创 2021-10-11 16:20:22 · 1367 阅读 · 0 评论 -
go语言为什么空切片,nil切片可以继续使用?append()函数
go语言为什么空切片,nil切片可以继续使用?首先先说明下什么是空切片?什么是nil切片?通过var a [ ]int创建的切片是一个nil切片通过b:=make([]int,0)创建的是一个空切片,(底层数组为空,但底层数组指针非空)问题:在之前一直认为切片必须要初始化才可以使用,今天刷力扣时发现如下情况:var s []string s = append(s, "a") fmt.Println(s)//可以使用 var m map[string]string原创 2021-03-12 20:26:51 · 2968 阅读 · 0 评论 -
go defer 使用规则
defer用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行规则一:延迟函数的参数在defer语句出现时就已经确定下来了如:func a() { i := 0 defer fmt.Println(i) i++ return}defer语句中的fmt.Println()参数i值在defer出现时就已经确定下来,实际上是拷贝了一份。后面对变量i的修改不会影响fmt.Println()函数的执行,仍然打印”0”。但是注意 这里原创 2021-08-31 17:32:53 · 197 阅读 · 0 评论 -
go语言内存对齐
内存对齐为保证程序顺利高效的运行,编译器会把各种类型的数据安排到合适的地址并占用合适的长度,这就是内存对齐每种类型的对齐值就是他的内存边界64位类型对齐边界 (对齐值)int81byteint162byteint324byteint648bytestring8byte32位类型对齐边界(对齐值)int81byteint162byteint324byteint644bytestring原创 2021-07-20 18:19:46 · 75 阅读 · 0 评论 -
go语言程序启动顺序
原创 2021-09-28 16:23:43 · 143 阅读 · 0 评论 -
go并发编程
Channelx := <- ch // 从ch中接收值并赋值给变量x<-ch // 从ch中接收值,忽略结果关闭我们通过调用内置的close函数来关闭通道。 close(ch)关于关闭通道需要注意的事情是,只有在通知接收方goroutine所有的数据都发送完毕的时候才需要关闭通道。通道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭通道不是必须的。注意:对一个关闭的通道再发送值就会导致panic对一个关闭的原创 2021-07-24 11:41:44 · 70 阅读 · 0 评论 -
go-Gorm
软删除如果模型中有 DeletedAt 字段,它将自动拥有软删除的能力!当执行删除操作时,数据并不会永久的从数据库中删除,而是将 DeletedAt 的值更新为当前时间。原创 2021-06-16 16:39:51 · 63 阅读 · 0 评论