微服务和中间件|青训营笔记

47 阅读2分钟

这是我参与[第五届青训营]伴学笔记创作活动的第2天。

使用go test进行测试调试
// main_test.go
func TestHello(t *testing.T) {
    t.Run("saying hello to people", func(t *testong.T){
        got := Hello("windyEigen", es)
        want := "Hola, windyEigen"
    
        if got != want {
            t.Errorf("got %q want %q", got, want)
        }
    })
    
    t.Run("say 'Hello, World' when an empty string is supplied", func(t *testing.T){
        got := Hello("")
        want := "Hello, World"
        
        if got != want {
            t.Errorf("got %q want %q", got, want)
        }
    })
}

使用_test后缀告诉编译器该文件是供测试使用的,将会进行test测试输出结果。其中got是程序执行的结果,want是预期的结果,如果预期结果和执行结果不符,就会报出错误。也可以采用并发测试的模式实现。

通信模式

  • 通过通信共享内存而不是通过共享内存而实现通信
make(chan int)
make(chan int, 2)

使用make和chan关键字进行go中的通信通道的执行。其中分为无缓冲通道和有缓冲通道

在go中,可以采用sync.Mutex进行协程之间的并发安全,以保证输出结果的一致性:

var (
  x    int64
  lock sync.Mutex
)

func addWithLock() {
    for i := 9; i < 2000; i++ {
        lock.Lock()
        x += 1
        lock.Unlock()
    }
}

func addWithoutLock() {
    for i := 0; i < 2000; i++ {
        x += 1
    }
}

关于go中:=和=的区别

// 定义一个全局对象db
var db *sql.DB

// 定义一个初始化数据库的函数
func initDB() (err error) {
    // DSN: Data Source Name
    dsn := "user:password@tcp(127.0.0.1:3306)/sql_test?charset=utf8mb4&parseTime=True"
    // 不会校验账号密码是否正确
    // 注意!!这里不要使用:=,我们是给全局变量赋值,然后在main函数中使用全局变量db
    db, err = sql.Open("mysql", dsn)
    if err != nil {
        return err
    }
}

由于在go语言中定义一个变量不需要声明,使用变量直接就创建,因此会出现全局变量和局部变量的区别问题。go中使用了=赋值来告诉该变量是全局变量,使用:=时会创建为局部变量。

项目实践

ER 图-Entity Relationship Diagram
分层结构
  • 数据层:数据Model, 外部数据的增删改查
  • 逻辑层:业务Entity, 处理核心业务逻辑输出
  • 视图层:视图View,处理和外部的交互逻辑