1

我有一个看起来像这样的 JSON 结构pkg/response/foobar.go

type Foo struct {
    RequestID      string                     `json:"request_id"`
    Response       string                     `json:"response"`
}

func (resp *Foo) JSONBytes() []byte {
    result, err := json.Marshal(resp)
    if err != nil {
        // log the error (see below)
    }
    return result
}

我对 Go陌生,我正在尝试集成 Uber 的 Zap 记录器。中pkg/endpoint/route1.go,我有

func processRequest(s *zap.SugaredLogger, // other params) error {
    for resp := range responses {
        //... other cases

        case *response.Foo:
            resp.Sugar = s // want to do something like this
            respBytes := resp.JSONBytes()
            wsResponses <- respBytes
    }
}

然后我希望能够传递正在使用的记录器processRequest并使其可用于JSONBytes(). 但是,我不确定将 JSON 结构与方法混合的含义:

type Foo struct {
    RequestID      string                     `json:"request_id"`
    Response       string                     `json:"response"`
    Sugar          *zap.SugaredLogger         `json:"-"`
}

然后我可以在其中使用记录器JSONBytes()。如果我尝试将它作为参数传递给 to JSONBytes(s),我会得到

resp (variable of type response.Response) cannot have dynamic type *response.Foo (wrong type for method JSONBytes (have func(s *go.uber.org/zap.SugaredLogger) []byte, want func() []byte))compilerImpossibleAssert

使记录器可用于JSONBytes().

4

0 回答 0