Golang
阳光_你好
这个作者很懒,什么都没留下…
展开
-
Golang语言中的逃逸分析详解
说到逃逸分析我们先聊一聊C/C++中的malloc和new,他们都可以从堆上分配到一块内存,该内存的销毁都是需要程序员来销毁,一不小心就可能发生内存泄漏,这是很危险的。首先我们来看一下他们有什么区别:(1)malloc:是memory(内存)和allocate(分配)缩写结合:(2)new从自由存储区上分配内存(自由存储区是C/C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请该内存为自由存储区);逃逸分析基本原则:编译器分析代码的特征和代码的声明周期,如果一个函数返回堆一个变量的引用原创 2022-12-05 10:38:38 · 957 阅读 · 0 评论 -
Go与C/C++中的堆和栈比较
首先我们确定一点不管是Go还是C/C++都有堆和栈的概念,我们今天说的是它们到底有何不同,有什么区别。C/C++中提及的“程序堆栈”本质上其实是操作系统层级的概念;+ 它通过C/C++语言的编译器和所在环境来共同决定;+ 在程序启动时,操作系统会自动维护一个所启动程序消耗内存的地址空间,并自动将这个空间从逻辑上划分为堆内存空间和栈内存空间。这时,“栈”的概念是指程序运行时自动获得的一小块内存,而后续的函数调用所消耗的栈大小,会在编译期间由编译器决定,用于存储局部变量或者保存函数调用栈;原创 2022-12-04 23:12:02 · 479 阅读 · 0 评论 -
Golang语言中如何确定是否发生逃逸
执行编译指令:go build -gcflags ‘-m -l’ main.go我们来分析一下结果,很明显,变量a发生了逃逸,被分配到堆内存。但是有一点大家可能不明白main函数中的b也发生了逃逸,这是因为fmt.Println(a …interface{})参数是interface,编译期间很难确定其具体类型,这种情况也会发生逃逸。go tool compile -S main.go终端输出结果:结果分析,0x001e 00030 (main.go:6) CALL runtime原创 2022-12-04 21:58:58 · 291 阅读 · 0 评论 -
golang 实现并发
go语言,语言层面原生支持高并发,通过关键字go与信号通道channel组合实现。实现起来还是相当容易的例如:2 通过sync.WaitGroup除了关键字go和channel,我们还有更简单的方法来实现,就是标准库sync中的WaitGropWaitGroup等待一组goroutines完成。主goroutine调用Add来设置要等待的goroutine的数量。然后每个goroutines运行并在完成时调用Done。同时,Wait可以用来阻塞,直到所有goroutines完成。WaitGroup在原创 2022-07-05 10:27:03 · 527 阅读 · 0 评论 -
流量复制Goreplay及python3中间件使用
1 简介1.1 说明GoReplay 是一个开源网络监控工具,可以记录您的实时流量并将其用于阴影、负载测试、监控和详细分析。线上环境需要迁移流量,我们应该确定流量切换过去后没有问题,即确保新的环境是OK的。那么我们借助goreplay工具就会很方便,不会担心影响线上的用户也能模拟线上流量测试。随着应用程序的增长,测试它所需的工作量也呈指数增长。GoReplay 为您提供了重用现有流量进行测试的简单想法,这使得它非常强大。我们最先进的技术允许您分析和记录您的应用程序流量而不影响它。这消除了将第三方组件置原创 2022-05-20 11:44:18 · 1067 阅读 · 0 评论 -
golang中的iota
go语言中我们在定义常量的时候,经常会用到iota,它比较特殊,可以被认为是一个可被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字会自动增1,用法如下:const ( // iota被重设为0 c0 = iota // c0 == 0 c1 = iota // c1 == 1 c2 = iota // c2 == 2 ) const ( a = 1 << iota // a == 1 (iota在原创 2021-10-14 14:47:27 · 415 阅读 · 0 评论 -
go语言中的new()和mark()用法
Go语言内存分配机制Go语言有两种分配内存的机制new()和make(),我们简单分析一下两种机制的不同new函数new()函数可以给一个值类型的数据分配数据内存,调用成功后返回一个初始化的内存块指针,原型定义如下:func new(Type) * Type在调用new()函数时要注意,参数Type是一个类型而不是具体的数值,函数调用成功后返回该类型的内存指针,同时该类型被初始化为“0”值。new是一个分配内存的内置函数,但不同于其他语言中new所作的工作,它只是将内存清零,而不是初始化内存。原创 2021-09-10 15:55:43 · 925 阅读 · 0 评论 -
golnd中gopath配置,解决不从Gopath下读包模块问题
相信很多初学者,在首次使用goland编辑器时,用gopath管理包模块的时候会遇到这样的问题,特别是从git远程仓库下git pull下来的工程代码,goland上调试的时候会发现,它只会从goroot路径下去寻找包,并不会去Goland配置的gopath路径。gopath 配置:明明已经配置了gopath,但是为什么不起作用呢。那是因为用gopath管理包时,需要讲GoModules下Enable Go modules intergration 去掉勾选,这样就OK了...原创 2021-09-02 20:09:12 · 841 阅读 · 0 评论 -
Golang 建立简单web服务器
Golang 建立简单web服务器Go语言里面提供了一个完善的net/http包,通过http包可以很 方便的就搭建起来一个可以运行的web服务。那么我门来建立一个简单的demo吧!package mainimport ( "fmt" "log" "net/http")func IndexFunc(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "Wellco原创 2021-09-02 19:30:11 · 992 阅读 · 0 评论