登录
首页 >  Golang >  Go问答

编写一个接受字符串或错误作为参数的通用函数的方法

来源:stackoverflow

时间:2024-02-24 16:03:26 186浏览 收藏

从现在开始,努力学习吧!本文《编写一个接受字符串或错误作为参数的通用函数的方法》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

有什么方法可以将字符串或错误作为通用参数吗?

package controller

import (
    "fmt"
    "net/http"

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

type servererror[t fmt.stringer] struct {
    reason t `json:"reason"`
}

func responsewithbadrequest[t fmt.stringer](c *gin.context, reason t) {
    c.abortwithstatusjson(http.statusbadrequest, servererror[t]{reason: reason})
}

上面的代码包含一个辅助函数,尝试使用包含一个通用字段的 json 响应 http 请求,我希望它是 stringerror

但是当我尝试输入字符串时:

string does not implement fmt.stringer (missing method string)

我觉得这很有趣。

我尝试将 t fmt.stringer 更改为 t 字符串 | fmt.stringer

cannot use fmt.Stringer in union (fmt.Stringer contains methods)

我明白原因是golang中的string是一种原始数据类型,没有任何方法,我想知道是否有可能的方法来做到这一点。

更新:

正如 @nipuna 在评论中指出的那样,error 也不是 stringer


正确答案


有什么方法可以将字符串或错误作为通用参数吗?

没有。如上所述,您正在寻找的约束是 ~string | error,它不起作用,因为带有方法的接口不能在联合中使用。

error 确实是 error() string 方法的接口。

处理此问题的明智方法是删除泛型并将 reason 定义为 string

type servererror struct {
    reason string `json:"reason"`
}

您可以在这里找到更多详细信息:Golang Error Types are empty when encoded to JSON。 tl;dr 是 error cant 不应该直接编码为 json;无论如何,你最终都必须提取它的字符串消息。

所以最后你要对字符串做这样的事情:

reason := "something was wrong"
c.abortwithstatusjson(http.statusbadrequest, servererror{reason})

类似这样的错误:

reason := errors.New("something was wrong")
c.AbortWithStatusJSON(http.StatusBadRequest, ServerError{reason.Error()})

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《编写一个接受字符串或错误作为参数的通用函数的方法》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>