legs+ 发表于 2023-5-24 19:46:15

两张图对比:

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6068eff627c84507a30e1571884c6913~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp







学php的朋友或许会陌生,但是学Java那是刻苦铭心!
其实,在学go的时候不一定要这样分层,但是习惯了你就会觉得这样分,优雅!

legs+ 发表于 2023-5-24 19:54:37

https://blog.csdn.net/qq_46429858/article/details/124376456


...
反正,我也闹不清楚,只是跟着做
所以,把教程奉上

legs+ 发表于 2023-5-24 20:01:19

本帖最后由 legs+ 于 2023-5-24 20:06 编辑

中间件,以前,我闹不清楚。
以前无论C#或者Java都是通过程序流程或代码来实现,后来学深了感觉还是中间件好,透过AOP(切面)更理想。
就是封装的太厉害了

legs+ 发表于 2023-5-24 20:26:31

本帖最后由 legs+ 于 2023-5-24 20:27 编辑

我看现在的一些初学者喜欢,刷题,go的题都有人刷,而且还不少
我奉劝去刷Java、c#或c++
go的题,没有啥技术含量

legs+ 发表于 2023-5-31 15:22:04

写了一个小Demo:
func SetupRouter() *gin.Engine {
        if setting.Conf.Release {
                gin.SetMode(gin.ReleaseMode)
        }
        r := gin.Default()
        // 告诉gin框架模板文件引用的静态文件去哪里找
        r.Static("/static", "static")
        // 告诉gin框架去哪里找模板文件
        r.LoadHTMLGlob("templates/*")
        r.GET("/", controller.IndexHandler)

        // v1
        v1Group := r.Group("v1")
        {
                // 待办事项
                // 添加
                v1Group.POST("/todo", controller.CreateTodo)
                // 查看所有的待办事项
                v1Group.GET("/todo", controller.GetTodoList)
                // 修改某一个待办事项
                v1Group.PUT("/todo/:id", controller.UpdateATodo)
                // 删除某一个待办事项
                v1Group.DELETE("/todo/:id", controller.DeleteATodo)
        }
        return r
}上面是路由

legs+ 发表于 2023-5-31 15:23:02

下面是控制器:
func IndexHandler(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", nil)
}


func CreateTodo(c *gin.Context) {
        // 前端页面填写待办事项 点击提交 会发请求到这里
        // 1. 从请求中把数据拿出来
        var todo models.Todo
        c.BindJSON(&todo)
        // 2. 存入数据库
        err:=models.CreateATodo(&todo)
        if err != nil{
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
        }else{
                c.JSON(http.StatusOK, todo)
                //c.JSON(http.StatusOK, gin.H{
                //        "code": 2000,
                //        "msg": "success",
                //        "data": todo,
                //})
        }
}

func GetTodoList(c *gin.Context) {
        // 查询todo这个表里的所有数据
        todoList, err := models.GetAllTodo()
        if err!= nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
        }else {
                c.JSON(http.StatusOK, todoList)
        }
}

func UpdateATodo(c *gin.Context) {
        id, ok := c.Params.Get("id")
        if !ok {
                c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
                return
        }
        todo, err := models.GetATodo(id)
        if err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
        }
        c.BindJSON(&todo)
        if err = models.UpdateATodo(todo); err!= nil{
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
        }else{
                c.JSON(http.StatusOK, todo)
        }
}

func DeleteATodo(c *gin.Context) {
        id, ok := c.Params.Get("id")
        if !ok {
                c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
                return
        }
        if err := models.DeleteATodo(id);err!=nil{
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
        }else{
                c.JSON(http.StatusOK, gin.H{id:"deleted"})
        }
}

页: [1]
查看完整版本: 两张图对比: