12 factors:
- 基准代码 一份基准代码,多份部署(部署在任何环境上的版本都能找到代码)
- 依赖 显示声明依赖关系 (比如C语言, 依赖.h, 不支持声明XX版本。) go语言可以依赖A模块的xx版本
- 配置 在环境中存储配置 ,(代码与配置分离,在生产系统变更时更便捷,代码需要走流水线,流程重)
- 后端服务, 把后端服务当做附加资源
5 - 进程 以一个或多个无状态进程去运行
(不依赖数据,当进程出现问题时可以随意停止进程,用另一个进程替换他)
为什么需要go语言?
多核出现,现有语言对多核支持不友好
1. C语言缺乏好的依赖管理,依赖头文件(不支持哪个模块哪个版本)
2. java, C++ 可能解决依赖管理的问题,语言过于笨重。 java解决了依赖管理?
3. C语言对垃圾回收缺乏支持, java支持垃圾回收,但是对并行计算支持不够友好,支持多线程,还是重。
go 语言支持协程。
go语言: 编译高效,支持高并发的,面向垃圾回收的全新语言。
1. 秒级完成大小程序的单节点编译
2. 依赖管理清晰
3. 不支持继承
4. 支持垃圾回收,支持并发执行,支持多线程通信
5. 对多核计算机支持友好。
不支持:
1. 不支持函数重载和操作符重载
2. 不支持隐式转换
3. 支持接口抽象,不支持继承
4. 不支持动态加载代码
5. 不支持动态链接
6. 通过recover 和 panic来替代异常机制
7. 不支持断言
8. 不支持静态变量
go 语言从哪来?
CSP多线程模型, C语言的基本语法和数据结构, java 接口抽象, 包定义 java,C# , 多态支持来自ruby javascript, 以及其他动态语言。
应用与 docker, kubernetes, lstio.
go 环境的安装:
GOROOT : 语言的按安装路径
GOPATH : src 存放源代码
pkg: 存放依赖包
bin: 存放可执行文件
其他变量:GOOS
GOARCH,
GOPROXY export GOPROXY=https://goproxy.cn
go的基本命令:
build, 构建, fmt 格式化风格
get 按照包, install 编译按照
test 单元测试
eg: go build -o bin/mybinary
GOOS=linux GOARCH=amd64 go build
$GOROOT/src/go/build/syslist.go
go build 遇到的问题, # Error message "go: go.mod file not found in current directory or any parent directory; see 'go help modules'"
通过 go env -w GO111MODULE=off 解决
go test 单元测试
go vet 检测可能存在的问题, 比如printf格式问题, 不可达代码。
go语言的语法
if
switch
for
for-range