1. Go的命名规范(生成自ChatGPT)
1.1 包名
包名应该小写并尽可能用单个简短的词组,不要使用下划线或混合大小写。
1.2 文件名
Go 语言的文件名通常为小写字母,可以包含下划线 (_) 或点 (.),但不建议,并确保它们描述了文件的内容:
- 如果是单词,则最好不要使用下划线。
- 对于多单词的文件名,请使用下划线将它们连接起来。
1.3 变量名
Go 中变量名的命名规范为驼峰式,即首个单词小写,其余单词首字母大写。变量名应该具备一定的描述性加以区分,尽量避免过于宽泛的命名方式。
1.4 常量名
与变量命名规范相似,Go 常量采用大写字母,此外,在包级别定义的常量通常使用驼峰式。
1.5 函数名、类型名和接口名
函数名可以采用驼峰式也可以使用大写字母加下划线(参考常量命名规范)。Go 的类型命名同样遵循驼峰式,类型(类)名应当使用完整的英文单词,并具备描述性。在 Go 中,不以大写字母打头的名称是不能导出 (exported) 的,在其他包中不可见。
接口名需要突显其行为特征,因此建议使用以 er 结尾的形式,例如:
type Reader interface {Read(p []byte) (n int, err error)
}
2. Gin框架
2.1 Gin框架的特点
1.封装比较好,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
2.运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json
3.模块比较少,可以自己由构建
4.是一个MVC架构的框架,类比SpringMVC容易上手
参考文章:(36条消息) Gin框架学习_gin.default()_凌木LSJ的博客-CSDN博客
2.2 数据访问层
这一层主要包括了类型的定义(对象结构体)、获取类的相关方法,下面的例子主要返回了对象数组:
// Package models 数据访问层
package modelsimport ("Im/utils""gorm.io/gorm"
)type UserBasics struct {gorm.Modelname stringpassword stringphoneNum stringemail stringidentity stringclientId stringclientPort stringdeviceInfo stringloginTime uint64heartbeatTime uint64logoutTime uint64isLogout boolisAdmin bool
}type Product struct {// 用于数据库表的创建,方便模型定义// 包含了 ID, CreatedAt, UpdatedAt, DeletedAt四个属性gorm.ModelProCode stringProName stringProPrice uint
}// TableName 获取表UserBasics
func (table *UserBasics) TableName() string {return "user_basics"
}// GetUserList 获取UserList
func GetUserList() []*UserBasics {// 初始化了一个长度为10的slice(切片)对象,每一个元素的默认值为nil,因为切片中的用户对象都将作为指针存储。users := make([]*UserBasics, 10)utils.DB.Find(&users)//for _, user := range users {// fmt.Println(user)//}return users
}func GetProductList() []*Product {products := make([]*Product, 10)utils.DB.Find(&products)//for _, product := range products {// fmt.Println(product)//}return products
}
2.3 业务层
这一层主要是调用数据访问层,然后返回JSON数据:
// Package service 业务层
package serviceimport ("Im/models""github.com/gin-gonic/gin""net/http"
)// GetUserList 使用gin.Context获取JSON数据
func GetUserList(c *gin.Context) {users := make([]*models.UserBasics, 10)users = models.GetUserList()c.JSON(http.StatusOK, gin.H{"message": users,})
}func GetProductList(c *gin.Context) {products := make([]*models.Product, 10)products = models.GetProductList()c.JSON(http.StatusOK, gin.H{"message": products,})
}
2.4 路由层
这一层主要是将方法映射到相应的请求路径上,gin.Engine会自动渲染数据:
// Package router 路由层
package routerimport ("Im/service""github.com/gin-gonic/gin"
)func Router() *gin.Engine {// 创建默认的gin.Engine对象r := gin.Default()// 将相应方法映射到对应路径r.GET("/index", service.GetIndex)r.GET("/user/getUserList", service.GetUserList)r.GET("/product", service.GetProductList)return r
}
2.5 配置
考虑将数据库DSN等配置文件放入yml文件作为系统的配置文件:
app :"IM"
mysql :dsn : "root:111111@tcp(localhost:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
2.6 工具
考虑将系统初始化放入工具包中,初始化包括Mysql在内的各项系统配置:
// Package utils 工具类
package utilsimport ("fmt""github.com/spf13/viper""gorm.io/driver/mysql""gorm.io/gorm"
)var (DB *gorm.DB
)// InitConfig 初始化应用程序的一些设置
func InitConfig() {// 设置设置名为"config"viper.SetConfigName("config")// 设置读取配置路径为"config"viper.AddConfigPath("config")// 读取配置文件"err := viper.ReadInConfig()if err != nil {panic(err)}fmt.Println("app init!")
}// InitMysql 从viper中获取mysql设置中的dsn即数据源url的值,特别注意这里要把DB传出去, 不然链接无效
func InitMysql() {DB, _ = gorm.Open(mysql.Open(viper.GetString("mysql.dsn")), &gorm.Config{})fmt.Println("Mysql init!")
}
这里要十分注意:必须将GORM数据库连接变量设置为指针,以便直接修改其值,首字母大写使可见性为public,以便连接成功后可以在其他包中调用数据库连接。
2.8 main.go
主程序要调用上述各个初始化,实现数据库连接以及其他功能的初始化,并且要调用路由层的Run方法,实现对对应的端口进行监听:
package mainimport ("Im/router""Im/utils"
)func main() {// 初始化设置utils.InitConfig()// 初始化Mysql设置utils.InitMysql()// 调用控制器r := router.Router()err := r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") 可以通过修改r.Run(":xxxx")修改端口号if err != nil {panic(err)}
}
3. 总结
今天学习了Go的命名规范,以及使用Gin框架进行开发的基本流程,了解了一些常用的方法,类比SpringMVC框架就可快速理解Gin框架各个部分的含义,初步了解开发流程。
项目结构: