场景:假如我只是拥有一点点go语法基础的小白,如果我们想用最短的学习时间写出一些后端服务该怎么办?
其实笔者也是小白,只是了解掌握一些基础的开发流程,但是就算是这样小白的我也能写服务。这时就要依赖于我们的神器,copilot啦。
话不多说,我们直接开冲
1.首先准备好这样一个文件夹,一个mod文件和一个空的main.go

其中go.mod文件就是我们的依赖存储文件
可以通过下方的命令快捷生成,记得将name替换为你自己的名称
shell
go mod init {name}
2.main文件准备基本的结构
go
package main
func main() {
}
到了这里有的小伙伴可能就会懵逼了,我就学了这些 下一步该怎么办? 其实我们的后端服务往简单的来说,就是负责客户端和数据库之间的联系。
收到数据 -> 存入数据库
查询数据 -> 返回到客户端
当然里面也有很多数不清的技术难点,但这里只是简单归纳,不做讨论
所以首先我们需要清楚的是我们需要构建一个路由树来处理前端的http请求,这里我们选用gin框架来构建
然后重要的来了,向copilot提问

这边也是给出了我们的答案,但是------我们肯定不满足于此,我们不仅仅是要写出服务还要规范目录
于是我们继续提问
sql
我想把一个user路由单独存放到一个目录里面应该怎么写

- 新建一个router文件夹
- 新建一个router.go文件
将提示的代码复制到文件里
go
package router
import (
"net/http"
"github.com/gin-gonic/gin"
)
func UserRoutes() *gin.Engine {
r := gin.Default()
userGroup := r.Group("/user")
{
userGroup.POST("/login", login)
userGroup.POST("/register", register)
}
return r
}
func login(c *gin.Context) {
name := c.Param("name")
c.JSON(http.StatusOK, gin.H{"Hello": name})
}
func register(c *gin.Context) {
name := c.Param("name")
c.JSON(http.StatusOK, gin.H{"Hello": name})
}
不出意外的话该出意外了,import爆红了。 我们直接将错误信息复制给copilot chat,他会告诉我们使用下面这条命令
shell
go get github.com/gin-gonic/gin
但是有golang经验的大佬应该会使用
shell
go mod tidy
类似于前端的npm i 但是也有不同 不做深入讨论
此处2种方法都可以解决
暂时我们就不需要动router文件了,因为我们有了另一个麻烦,如何链接数据库呢?
然后我通过copilot得知 可以使用gorm 并且他也给出了例子

然后我们
- 新建一个database,model文件夹
- 新建一个database.go文件
将我们的表映射结构体复制到model下面新建一个user.go文件并放入
go
type Product struct {
gorm.Model
Code string
Price uint
}
由于copilot给出的映射并不是我们想要的user表,所以需要手动修改下 更改后的如图

go
type User struct {
ID uint `gorm:"primarykey" json:"ID"` // 用户UUID
Username string `json:"username" gorm:"index;comment:用户登录名"` // 用户登录名
Password string `json:"password" gorm:"comment:用户登录密码"` // 用户登录密码
Nickname string `json:"nickname" gorm:";comment:用户昵称"` // 用户昵称
Avatar string `json:"avatar" gorm:"default:http://qmplusimg.henrongyi.top/head.png;comment:用户头像"` // 用户头像
}
然后我们继续提问

在database文件夹中新建database.go 将结果复制到database.go
go
var DB *gorm.DB
func InitDB() {
dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
DB.AutoMigrate(&system.User{})
}
加DB.AutoMigrate(&system.User{}) 是为了没有表的时候自动建立表
使用go mod tidy 更新依赖, 记得将下图的数据库配置更改为你自己的
这里我是用docker启动了一个mysql容器 具体的环境可以看你们自己

然后我们在main文件调用 尝试启动


可以看到是成功启动了
测试一下
由于我使用的wsl所以用了一层转发 你们实际访问的时候还是8080端口
