这是我参与[第五届青训营]伴学笔记创作活动的第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,处理和外部的交互逻辑