Go语言项目初始化
目标:使用go语言开发接口,从数据库中获取数据
环境配置
依赖管理初始化,在项目的路径下输入go mod init <模块名称>
执行完成后,可以发现在当前目录下出现go.mod文件
设置GOROOT和GOPATH,GOROOT是安装go语言的位置,GOPATH是依赖放置的位置

接入数据库
Mysql
使用GORM接入数据库,GORM参考文档,GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
package main
import (
"chat/models"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
db, err := gorm.Open(mysql.Open("root:root@tcp(49.232.5.241:23306)/chat?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 迁移 schema
db.AutoMigrate(&models.UserBasic{})
// Create
user := &models.UserBasic{}
user.Name = "caoyu"
db.Create(user)
// Read
fmt.Print(db.First(user, 1)) // 根据整型主键查找
// Update
db.Model(user).Update("Password", "caoyu")
}
使用AutoMigrate时,需要保证字段开头大写,如果在数据库中不存在表格时,会自动创建表格,并且会在结构体字段的基础上添加created_at
、updated_at
、deleted_at
等字段,目前不知道这些多余字段怎么设置可以取消。
Redis
接入web框架
Gin官方文档,官方示例给的很简单,如下所示,实际开发中需要把路由和逻辑处理分开,这样以后维护起来更方便
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default() //获取到默认的路由
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
}) //使用get请求,路径为/ping,执行匿名方法
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
下面演示真实项目结构
1.路由层,负责将请求中路径和service层的方法进行匹配
package router
import (
"chat/service"
"github.com/gin-gonic/gin"
)
func Router() *gin.Engine {//方法返回必须为指针,main函数会调用
r := gin.Default()
r.GET("/index", service.GetIndex)
return r
}
2.服务层,负责真实业务逻辑处理
package service
import "github.com/gin-gonic/gin"
func GetIndex(c *gin.Context) {
c.JSON(200, gin.H{"msg": "caoyu"})
}
main方法启动
package main
import "chat/router"
func main() {
r := router.Router()
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
抽取配置文件
将mysql需要配置,单独做成yml文件,然后使用github.com/spf13/viper
包下viper来读取配置
创建配置文件
在根目录下创建config文件夹,随后创建app.yml文件,写入配置参数
mysql:
url: '@tcp(49.xxx.x.xxx:23306)/chat?charset=utf8mb4&parseTime=True&loc=Local'
username: 'root'
password: 'root'
创建初始化方法
在根目录下创建utils文件夹,在改目录下创建init.go,用来做mysql连接的初始化,需要使用时直接utlis.DB即可对数据库进行操作
package utils
import (
"fmt"
"github.com/spf13/viper"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB
var dsn string
// InitConfig 初始化配置文件
func InitConfig() {
viper.SetConfigName("app")
viper.AddConfigPath("config")
err := viper.ReadInConfig()
if err != nil {
fmt.Print(err)
}
fmt.Println("config app :", viper.Get("app"))
dsn = viper.GetString("mysql.username") + ":" + viper.GetString("mysql.password") + viper.GetString("mysql.url")
fmt.Println("config mysql:", dsn)
}
// InitMysql 初始化数据
func InitMysql() {
DB, _ = gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
在启动时进行初始化
在main方法中调用初始化方法即可
package main
import (
"chat/router"
"chat/utils"
)
func main() {
utils.InitConfig()
utils.InitMysql()
r := router.Router()
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
整合
访问接口拿到数据库中的数据
编写service层
在根目录下创建service文件夹,随后创建userService.go文件,文件的代码会使用utlis.DB来访问数据库
package service
import (
"chat/models"
"chat/utils"
"github.com/gin-gonic/gin"
)
func GetUserList(c *gin.Context) {
data := make([]*models.UserBasic, 10)
utils.DB.Find(&data)
c.JSON(200, gin.H{"msg": data})
}
编写路由
目前设置路径/user
,调用service.GetUserList
package router
import (
"chat/service"
"github.com/gin-gonic/gin"
)
func Router() *gin.Engine {
r := gin.Default()
r.GET("/index", service.GetIndex)
r.GET("/user", service.GetUserList)
return r
}
启动并验证
可以看到mysql连接配置和服务监听端口
游览器访问,成功从数据库中拿到数据
评论