函数——go世界中的一等公民

在go的世界中,函数是一等公民,可以给变量赋值,可以作为参数传递,也可以直接赋值。
在go语言中将这样的变量、参数、返回值,即在堆空间和栈空间中绑定函数的值,称为function value



函数的指令在编译期间生成,使用go tool compile -S main.go可以获取汇编代码



函数调用的过程
在go语言中,每一个goroutine持有一个连续栈,栈基础大小为2kb,当栈大小超过预分配大小后,会触发栈扩容,也就是分配一个大小为当前栈2倍的新栈,并且将原来的栈拷贝到新的栈上。使用连续栈而不是分段栈的目的是,利用局部性优势提升执行速度,原理是CPU读取地址时会将相邻的内存读取到访问速度比内存快的多级cache中,地址连续性越好,L1、L2、L3 cache命中率越高,速度也就越快。



在go中,和其他一些语言有所不同,函数的返回值、参数都是由被caller保存。每次函数调用时,会在caller的栈中压入函数返回值列表、参数列表、函数返回时的PC地址,然后更改bp和pc为新函数,执行新函数,执行完之后将变量存到caller的栈空间中,利用栈空间中保存的返回地址和caller的栈基地址,恢复pc和sp回到caller的执行过程。



对于栈变量的访问是通过bp+offset的方式来访问,而对于在堆上分配的变量来说,就是通过地址来访问。在go中,变量被分配到堆上还是被分配到栈上是由编译器在编译时根据逃逸分析决定的,不可以更改,只能利用规则尽量让变量被分配到栈上,因为局部性优势,栈空间的内存访问速度快于堆空间访问。

https://segmentfault.com/a/1190000023340324



https://go.googlesource.com/proposal/+/master/design/draft-fuzzing.md



https://github.com/upmasked/number-verifier



https://medium.com/@pliutau/table-driven-tests-in-go-5d7e230681da



bee 1.3
它来了它来了,它带着大家的福音走来了,经过社区内同学日以继夜的努力,bee 1.3 正式发布了,为什么说它带来了福音,是因为这个版本新加的命令 bee pro gen,下面就着重介绍一下这个命令都能做什么。



bee pro gen
上面也提到了,crud 是很多人绕不过的坎,并不是说它有多困难,而是大量的重复工作会让很多人不胜其烦,beego 社区的同学考虑到了这个问题,所以在 bee 的新版本里推出了这个命令,简单来说,就是可以使用官方提供的配置模版,或者个性化定制的模版,通过这个命令快速的构建出 crud 代码,从而节省大量的时间。



你以为这就完了? 不不不,在构建出 crud 代码的同时,我们还可以生成相应的管理后台,数据库,并且自动打通前后端,让你可以直接在管理后台体验 crud 的功能。



到这里如果还觉得不过瘾,我们还提供了 Docker 环境的实例,可以几分钟之内飞速部署,快速体验 bee pro gen 带来的舒爽体验。



快速体验
创建项目
更新 bee go get -u github.com/beego/bee
创建一个 beego 项目, bee new beeblog
创建一个 ant design pro4 项目, cd beeblog && mkdir ant && cd ant && yarn create umi
安装 ant4 的依赖,npm i
创建数据库, CREATE DATABASE IF NOT EXISTS beeblog DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
创建 beegopro.toml
dsn = “root:@tcp(127.0.0.1:3306)/beeblog”
proType = “ant4”
[models.blog]
names = [“name”,”content”,”created_at”,”updated_at”]
orms = [“string”,”string”,”datetime”,”datetime”]
comments = [“名称”,”内容”,”创建时间”,”更新时间”]
[path]
beego = “.”
ant = “./ant/src/pages”
注入灵魂,执行生成脚本, bee pro gen
前端添加代码
/ant/package.json 增加 mock 方式 “start:dev”: “cross-env REACT_APP_ENV=dev umi dev”,
./ant/config/proxy.ts 增加 beego 反向代理
export default {
dev: {
‘/api/blog’: {
target: ‘http://127.0.0.1:8080’,
changeOrigin: true,
pathRewrite: { ‘^’: ‘’ },
},
‘/api/’: {
target: ‘https://preview.pro.ant.design’,
changeOrigin: true,
pathRewrite: { ‘^’: ‘’ },
},



},
test: {
‘/api/’: {
target: ‘https://preview.pro.ant.design’,
changeOrigin: true,
pathRewrite: { ‘^’: ‘’ },
},
},
pre: {
‘/api/’: {
target: ‘your pre url’,
changeOrigin: true,
pathRewrite: { ‘^’: ‘’ },
},
},
};
在 ./ant/config/config.ts 添加菜单
{ name: ‘博客’,icon: ‘RocketOutlined’,path: ‘/blog’,component: ‘./blog/list’},
{ path: ‘/blog/info’, component: ‘./blog/info’},
{ path: ‘/blog/update’, component: ‘./blog/update’},
{ path: ‘/blog/create’, component: ‘./blog/create’},



https://gocn.vip/topics/10724


Category golang