Go语言项目初始化

目标:使用go语言开发接口,从数据库中获取数据

环境配置

依赖管理初始化,在项目的路径下输入go mod init <模块名称>

image-20221229153029493

执行完成后,可以发现在当前目录下出现go.mod文件

image-20221229153129955

设置GOROOT和GOPATH,GOROOT是安装go语言的位置,GOPATH是依赖放置的位置

image-20221229153654560

接入数据库

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_atupdated_atdeleted_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连接配置和服务监听端口

image-20230117180251970

游览器访问,成功从数据库中拿到数据

image-20230117180351468