gpt4 book ai didi

Go接口(interface)方法使用

转载 作者:IT王子 更新时间:2023-10-29 01:43:18 26 4
gpt4 key购买 nike

我使用 Martini 库编写了一个非常简单的 Go 应用程序。在组合一个简单的 REST API 示例时,我想在发生如下错误时将 JSON 数据呈现给用户:

{
error: "Document Not Found",
code: 404
}

我正在使用以下代码返回一个 map ,Martini 可以将其呈现为 JSON。包错误响应

import "net/http"

type ErrJson interface {

RenderErr(v int)

}

func RenderErr(v int) map [string]interface{} {

var returnMap = map[string]interface{} {
"error": http.StatusText(v),
"code": v,
}

return returnMap

}

稍后在我的 Controller 代码中,我尝试使用

测试此方法
fmt.Println(ErrJson.RenderErr(400))

但是我得到以下错误:

controllers\FoodController.go:25: cannot use 400 (type int) as type ErrorResponces.ErrJson in function argument: int does not implement ErrorResponces.ErrJson (missing RenderErr method)

controllers\FoodController.go:25: not enough arguments in call to ErrorResponces.ErrJson.RenderErr controllers\FoodController.go:25: ErrorResponces.ErrJson.RenderErr(400) used as value

我很难弄清楚这个错误到底在说什么。

最佳答案

您似乎在尝试直接在接口(interface)类型上调用函数,而不是在实现该接口(interface)的对象上调用函数。

这是一个返回 JSON 数据的简单示例:

package main

import (
"encoding/json"
"github.com/codegangsta/martini"
"net/http"
)

func Encode(v ...interface{}) (string, error) {
var data interface{} = v
if v == nil {
// So that empty results produces `[]` and not `null`
data = []interface{}{}
} else if len(v) == 1 {
data = v[0]
}
b, err := json.Marshal(data)
return string(b), err
}

func RenderErr(v int) map[string]interface{} {
var returnMap = map[string]interface{}{
"error": http.StatusText(v),
"code": v,
}

return returnMap
}

func main() {
m := martini.Classic()
m.Get("/", func(c martini.Context, w http.ResponseWriter, r *http.Request) string {
w.Header().Set("Content-Type", "application/json")

str, err := Encode(RenderErr(400))
if err != nil {
panic(err)
}

return str
})
m.Run()
}

如果你想使用你的界面创意,你可以这样做(我试着复制你基本上在做的事情):

package main

import (
"encoding/json"
"github.com/codegangsta/martini"
"net/http"
)

func Encode(v ...interface{}) (string, error) {
var data interface{} = v
if v == nil {
// So that empty results produces `[]` and not `null`
data = []interface{}{}
} else if len(v) == 1 {
data = v[0]
}
b, err := json.Marshal(data)
return string(b), err
}

type ErrJson interface {
RenderErr() string
}

type ErrJsonCode int

func (e ErrJsonCode) RenderErr() string {
var returnMap = map[string]interface{}{
"error": http.StatusText(int(e)),
"code": int(e),
}

str, err := Encode(returnMap)
if err != nil {
panic(err)
}

return str
}

func main() {
m := martini.Classic()
m.Get("/", func(c martini.Context, w http.ResponseWriter, r *http.Request) string {
w.Header().Set("Content-Type", "application/json")
return ErrJsonCode(400).RenderErr()
})
m.Run()
}

虽然我不确定我会这样设计它。我可能会让它更通用,并让它支持多种内容类型,并且没有与其内容类型相关的错误。这是一篇关于使用 Martini 构建 RESTful API 的不错的文章:http://0value.com/build-a-restful-API-with-Martini (它使用了一些高级概念)。

关于Go接口(interface)方法使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20715905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com