1.微服务架构统一思想----------12元素(factors)
- 基准代码;一份基准代码,多份部署
- 依赖;显式声明依赖关系
- 配置;在环境中存储配置
- 后端服务;把后端服务当作附加资源
- 构建,发布,运行;严格分离构建和运行
- 进程;以一个或者多个无状态进程运行应用
- 端口绑定;通过端口绑定提供服务
- 并发;通过进程模型进行扩展
- 易处理;快速启动和优雅终止可最大化健壮性
- 开发环境与线上环境等价;尽可能的保持开发,预发布,线上环境相同
- 日志;把日志当作事件流
- 管理进程;后台管理任务当作一次性进程运行
2.Go语言的原则
Go语言是一个可以编译高效,支持高并发,面向垃圾回收的全新语言。
2-1 Go test
Go语言原生自带的测试
import "testing"
func TestIncrease(t *testing.T){
t.Log('start testing")
increase(1,2)
}
go test ./... -v 运行测试
go test 命令稻苗所有*_test.go为结尾的文件,惯例是将测试代码与正式代码放在同目录,如foo.go的测试代码一般协程foo_test.go
2-2 Go vet
代码静态检查,发现可能的bug或者可疑的构造
- print-format错误,检查类型不匹配的print;
- Boolean错误,检查一直为true、false
- Range循环,比如如下代码主协程会退出,go routine无法被执行
- return 之后竟然还有代码
- 其他错误,比如变量自己赋值,error检查滞后等
3.Go语法
3-1 if语法
if condition1 {
//do
} else if condition2{
//do
} else {
//catch-all
}
//if的简短语句
if v:=x - 100; v <0{
//do
}
3-2switch语法
switch var1 {
case var1://空分支
case val2://
fallthrough 执行case3中函数
case var3:
f()
default: //默认分支
....
}
每个case其实自带的是break
3-3 For循环
Go只有一种循环结构:for循环
1. 计入计数器的循环
for i := 0; i < 10; i++ {
sum += i
}
2. 初始化语句和后置语句是可选的,此场景和while等价(Go不支持while)
for ;sum < 100 {
sum += sum
}
3. 死循环
for {
if sum > 100{
break
}
sum += 1
}
4.For-range
支持遍历数组、切片、字符串、Map等
for index,char := range myString{
index是下标 char 是元素
}
for key,value := range myMap{
key是 键值
value 是值
}
需要注意的是:如果 for range 遍历指针数组,则value取出的指针地址为原指针地址的拷贝。