2013-12-21 5 views
2

Martini 라이브러리를 사용하여 매우 간단한 Go 앱을 작성했습니다. 나는 마티니 JSON으로 렌더링 할 수있는지도를 반환하려면 다음 코드를 사용하고Go 인터페이스 메소드 사용

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

: 간단한 REST API를 예제를 함께 넣어 때 나는 오류가 같이 발생했을 때 사용자에게 다시 JSON 데이터를 렌더링하고 싶었다. 패키지 ErrorResponces 나중에 내 컨트롤러 코드에서

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 

} 

나는 시도하고

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

내가 힘든 시간을 보내고 있습니다을 이 오류가 무엇을 말하는지 정확히 알아 냈습니다.

답변

2

인터페이스를 구현하는 객체 대신 인터페이스 유형에서 직접 함수를 호출하려고하는 것 같습니다. 당신이, 당신이 이런 일을 할 수있는 사용자 인터페이스 개념을 사용하고자하는 경우

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() 
} 

가 (난 당신이 기본적으로 무엇을하고 있는지 복사 시도) :

다음

는 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 
} 

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로 편안한 API를 구축하는 방법에 대한 기사입니다. http://0value.com/build-a-restful-API-with-Martini (일부 고급 개념 사용)

+0

아! 나는 지금 본다. 자원을 가져 주셔서 감사합니다. –

관련 문제