0

鉴于这种类型

type Response map[string]interface{}

我创建了一个方法 NewResponse 填充默认值:

 func NewResponse() Response {
    resp := Response{"status": 200, "msg": "Added jobs to queue"}

    resp_metadata := make(map[string]string)
    resp_metadata["base"] = "api/v1"
    resp_metadata["self"] = "/crawler/jobs/add"
    resp["metadata"] = resp_metadata
    return resp
}

我称之为喜欢NewResponse(),但我想改为这样做Response.New(),所以方法签名应该是这样的

func (Response) New() Response {

但后来我总是得到错误not enough arguments in call to Response.New

那么,这怎么可能实现呢?

4

3 回答 3

3

当你编写 Go 程序时,使用惯用的 Go。然后,其他人将能够阅读您的程序。例如,

package main

import "fmt"

type Response map[string]interface{}

func NewResponse() Response {
    metadata := map[string]string{
        "base": "api/v1",
        "self": "/crawler/jobs/add",
    }
    r := Response{
        "status":   200,
        "msg":      "Added jobs to queue",
        "metadata": metadata,
    }
    return r
}

func main() {
    resp := NewResponse()
    fmt.Println(resp)
}

输出:

map[status:200 msg:Added jobs to queue metadata:map[base:api/v1 self:/crawler/jobs/add]]
于 2013-07-10T16:08:09.347 回答
2

尽管它绝对不是惯用的 Go,但您可以执行以下操作:

type Response map[string]interface{}

func (r *Response) New() {
  *r = make(map[string]interface{})
  (*r)["hello"] = "World"
  (*r)["high"] = 5
}

func main() {
  var r Response
  r.New()
  for k, v := range r {
    fmt.Printf("%s = %v\n", k, v)
  }
}

但实际上,并没有错func NewResponse() Response

于 2013-07-10T15:45:00.887 回答
1

它没有。Go 没有构造函数。创建一个“空”对象就是创建一个对象类型的零值

您要做的是在现有的 Response 对象上调用一个名为 New 的 Response 方法,该对象将返回一个(不同的)Response 对象。

resp := Response{}或者resp := make(Response)如果您需要创建一个空响应也可以。

于 2013-07-10T15:45:43.477 回答