實戰Go web Hello world項目
該項目有什麼特性
- 規範了http響應
- 每層都有標準的接口
- 路由與控制分離
- 提供簡潔的啓動方法
技術棧
- go環境
- mysql
- gin 提供web化服務
- go mod 提供包管理
工程結構
響應輸出
代碼結構分析
-
包結構分析
- com.cn
dao : 提供數據庫層操作
model: 提示實體類
service: 業務處理類
web: 提供web服務類
router: 提供路由服務
GoWebApplication: 該類爲服務啓動類
- com.cn
-
業務層分析
web 層處理:
該層主要是對響應做統一處理.
BaseResponse
// TODO 這個地方後期需要調整爲類似於java中的泛型
type BaseResponse struct {
Code int `json:"code"`
Message string `json:"message"`
Data []User `json:"data"`
}
- 定義標準模板
type BaseApi interface {
/**
添加接口Add
*/
Add(user com_cn_model.User) com_cn_model.BaseResponse
/**
刪除接口Delete
*/
Delete(id int) com_cn_model.BaseResponse
/**
更新接口Update
*/
Update(user com_cn_model.User) com_cn_model.BaseResponse
/**
更新接口Update
*/
Get(user com_cn_model.User) com_cn_model.BaseResponse
/**
分頁接口List
*/
List(user com_cn_model.User , pageSize int, pageNum int) com_cn_model.BaseResponse
}
如果添加也是只需要實現該接口就行
-
service層
該層主要是對業務進行處理對邏輯做判斷 -
model 定義實體類對象
type User struct { Id int `json:"id"`// 用戶的唯一標識 Name string `json:"name"`// 用戶的名字 Age string `json:"age"`// 用戶年齡 }
-
dao層 對數據庫層操作
1、獲取鏈接啊
2、 操作數據庫等操作 -
router 提供http服務 使用的gin
- 定義標準接口
- 對路由接口進行分組
- 對外提供http服務
type AppRouter struct {
AppRouterRun
}
type AppRouterRun interface {
/**
定義啓動接口
*/
Run()
}
func (c AppRouter) Run(){
r := gin.Default()
//
group := r.Group("/user")
group.GET("/get", UserRouterImpl{}.Get)
r.Run("127.0.0.1:8080")
}
在spring中你可以理解衝RequestMapping用於窄化請求,r.Group("/user") 跟他的意思類似。
- GoWebApplication
該類爲總個服務的入口
import (
router "goweb/com.cn.router"
)
/**
應用的入口函數
*/
func main() {
router.AppRouter{}.Run()
}
爲什麼我要提供一個類做爲主要啓動的類呢,因爲springboot也是提供一個main啓動,雖然沒有springboot的一些特性自動裝配等等。但是提供一個main啓動類,這樣看上去代碼整潔。
後期改進的地方
- 提供類似於spring容器一樣的工具,這樣就不需要複雜的操作,同時也會提供代碼的可擴展性
- 提供類似mybatis數據庫表自動轉換爲實體類對象