我正在阅读Go Go Programming Languagex.(T)中的类型断言并且不理解它们.
我知道有不同的场景:
这是我不明白的:
我也搜索了这个话题,仍然不明白.
我想获取每个路由上的所有 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) 鉴于:
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) 我正在使用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)