亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何編寫一個以字符串或錯誤作為參數的泛型函數?

如何編寫一個以字符串或錯誤作為參數的泛型函數?

Go
開滿天機 2023-02-21 16:46:02
有沒有辦法將字符串或錯誤作為通用參數?package controllerimport (    "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 請求,我希望它是一個string或一個error.但是當我嘗試輸入一個字符串時:string does not implement fmt.Stringer (missing method String)我覺得這很有趣。我試圖更改T fmt.Stringer為T string | fmt.Stringer:cannot use fmt.Stringer in union (fmt.Stringer contains methods)我理解的原因是string在 golang 中是一種沒有任何方法的原始數據類型,我想知道是否有可能的方法來做到這一點。更新:正如@nipuna 在評論中指出的那樣,兩者error都不是Stringer。
查看完整描述

1 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

有沒有辦法將字符串或錯誤作為通用參數?

不,如前所述,您正在尋找的約束是~string | error,它不起作用,因為帶有方法的接口不能在聯合中使用。

并且error確實是一個帶有方法的接口Error() string。

處理這個問題的明智方法是放棄泛型并定義Reasonstring

type ServerError struct {
    Reason string `json:"reason"`}

您可以在此處找到更多詳細信息:Golang Error Types are empty when encoded to JSON。tl;dr 是error 不應該直接編碼為 JSON;無論如何,您最終都必須提取其字符串消息。

所以最后你要用字符串做這樣的事情:

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

和類似這樣的錯誤:

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


查看完整回答
反對 回復 2023-02-21
  • 1 回答
  • 0 關注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號