这是我参与 第五届青训营 伴学笔记创作活动的第2天
1.GO语言
-
高性能,高并发: go使用标准库或者任何基于标准库的第三方库都可以开发高并发程序
-
语法简单,学习曲线平缓: go语言语法类似c语言,在C语言的基础上进行大幅度的简化,循环只有for,去掉了不需要的表达式括号
-
拥有丰富的标准库
-
有完善的工具链:编译、代码格式化、错误检查、帮助文档、包管理、代码补充提示都有工具,此外内置完整的单元测试框架可以支持单元测试、性能测试、代码覆盖率、数据渐增监测、性能优化等,以保证代码正确稳定运行
-
静态链接: 编译是静态链接,只需拷贝编译后的唯一可执行文件exe 即可运行,不需附加任何东西就可部署运行,此外在线上的容器环境下运行镜像的体积可以控制的很小,部署方便快捷。
-
快速编译: go是静态语言中最快的编译速度,在微服务中线上部署的时间小于1分钟,在本地开发时修改代码都可在一秒钟左右完成增量编译。
-
跨平台: go程序可以windows、linux、mac等操作系统下运行,可以开发安卓和ios的软件,在各种设备如路由器、树莓派等设备上运行。go具有交叉编译特性,可以在笔记本上编译出一个二进制文件,放到路由器上运行,无需配置交叉编译环境。
-
垃圾回收: go语言有自动垃圾回收机制,无需考虑内存分配与释放,而是专注于业务逻辑。
2.并行
并发:多线程程序在一核cpu上运行。
并行:多线程程序在多核cpu上运行。
协程:用户态,轻量级线程,栈MB级别。创建和调度由go本身实现。线程可以跑多个协程。go一次可以创建上万协程,所以适合高并发场景。
线程:内核态,线程跑多个协程,栈KB级别。
3.依赖管理
Go依赖管理演进路线:gopath->go vendor->go moudle
gopath是go语言的环境变量,是一个工作区。项目下所有依赖都在src中,通过go get下载最新版本到src中。
vendor中存了项目依赖的副本,项目依赖优先从vendor找,找不到再找goroot。这样就实现了版本控制。问题是可能冲突,其实就是源码没办法标明版本。
moudle:模块路径,标识了模块,可以看到从哪里能找到这个模块。最关键的是描述单元依赖,由modulepath和版本号构成,可以唯一定位一个仓库的某一个版本。每次下载之前都可以go mod tidy一下,减少构建整个项目的时间。