相关疑难解决方法(0)

在Go中解释类型断言

我正在阅读Go Go Programming Languagex.(T)类型断言并且不理解它们.

我知道有不同的场景:

  • T是具体类型或接口
  • 可以返回一个(断言值?)或两个(ok)值

这是我不明白的:

  • 我为什么要用它们?
  • 他们究竟回归了什么?

我也搜索了这个话题,仍然不明白.

go

19
推荐指数
1
解决办法
8563
查看次数

如何处理 Gin 中间件中的错误

我想获取每个路由上的所有 http 错误,而无需每次重写 if 400 then if 404 then if 500 then 等等...所以我ErrorHandler()在每个路由处理程序中都有一个函数:

func (h *Handler) List(c *gin.Context) {
    movies, err := h.service.ListService()

    if err != nil {
        utils.ErrorHandler(c, err)
        return
    }

    c.JSON(http.StatusOK, movies)
}
Run Code Online (Sandbox Code Playgroud)

这个函数看起来像这样:

func ErrorHandler(c *gin.Context, err error) {
    if err == ErrNotFound {
        // 404
        c.JSON(http.StatusNotFound, gin.H{"error": ErrNotFound.Error()})
    } else if err == ErrInternalServerError {
        // 500
        c.JSON(http.StatusInternalServerError, gin.H{"error": ErrInternalServerError.Error()})
    } // etc...
}
Run Code Online (Sandbox Code Playgroud)

ErrNotFound或者ErrInternalServerError只是像这样初始化的全局变量:

var ErrNotFound = errors.New(http.StatusText(http.StatusNotFound))  // 404 …
Run Code Online (Sandbox Code Playgroud)

error-handling go go-gin

15
推荐指数
1
解决办法
3万
查看次数

如何包装路由处理函数 gin.HandlerFunc

鉴于:

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.POST("/status", handler)
    r.Run(":8080")
}

func handler(c *gin.Context) {

    var status string
    if err := c.ShouldBindJSON(&status); err != nil {
        c.JSON(503, gin.H{"status": "failed"})
    }
    c.JSON(200, gin.H{"status": "OK"})
}
Run Code Online (Sandbox Code Playgroud)

处理程序函数返回错误消息取决于它应该做什么,因为我有很多带有重复错误处理代码的函数来产生错误响应。

如何包装此处理程序以外部化错误处理和响应格式。例如:

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.POST("/status", wrapper(handler_status))
    r.GET("/health", wrapper(handler_health))
    r.Run(":8080")
}

func wrapper(f func(c *gin.Context) (string, error)) gin.HandlerFunc {

    status, err := f()

    if err != nil {
        c.JSON(503, gin.H{"status": err}) …
Run Code Online (Sandbox Code Playgroud)

go go-gin

4
推荐指数
1
解决办法
1万
查看次数

如何妥善处理gin / golang Web服务中的错误

我正在使用gin编写一个简单的REST API。我已经阅读了许多有关使出错处理在go中不再重复的文章和文章,但是我似乎无法全神贯注于如何在gin处理程序中进行错误处理。

我所做的所有工作就是对数据库运行一些查询,并将结果返回为JSON,因此典型的处理程序如下所示

func DeleteAPI(c *gin.Context) {
    var db = c.MustGet("db").(*sql.DB)
    query := "DELETE FROM table WHERE some condition"
    tx, err := db.Begin()
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    defer tx.Rollback()
    result, err := tx.Exec(query)
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    num, err := result.RowsAffected()
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    err = tx.Commit()
    if err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    c.JSON(200, gin.H{"deleted": num})
} …
Run Code Online (Sandbox Code Playgroud)

go

1
推荐指数
1
解决办法
1091
查看次数

标签 统计

go ×4

go-gin ×2

error-handling ×1