将具体值附加到接口数组

时间:2016-06-23 20:53:10

标签: go

我有以下结构:

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string" : {
            "query" : "query_term"
          }
        }
      ],
      "must_not": [
        {
          "term" : {
            "my_field" : "must_not_term"
          }
        },
        {
          "term" : {
            "my_field" : "must_not_term2"
          }
        }
      ],
      "filter": [
        {
          "term" : {
            "my_field" : "must_term1"
          }
        },
        {
          "term" : {
            "my_field" : "must_term2"
          }
        }
      ]
    }
  }
}

现在我有一些type Type interface { getFoo() []byte } type Concrete struct { } func (this *Concrete) getFoo() []byte { example := []byte{2, 3, 4} return example } 接口数组,例如:

Type

我想创建具体结构数组并用它初始化上面的数组,例如:

var arr []*Type

但它给了我var cObjArr []*Concrete cObj := new(Concrete) cObjArr = append(cObjArr, cObj) arr = cObj 的错误。怎么了?

2 个答案:

答案 0 :(得分:2)

这里有一些问题。

首先,

type Type interface{} {
  getFoo() []byte
}

应该是

type Type interface {
  getFoo() []byte
}

我认为这是试图展示一个小的,可重复的例子的结果。

接下来,arr应该是Type类型的切片,而不是*Type。指向界面的指针很少是你真正的意思。

因此,您的arr现在是Type ... []Type的一部分。对于当前范围的剩余部分,arr始终必须为[]Type类型。

cObjArr的类型为[]*Concrete。这很好,但cObjArr的值无法分配给arr,因为它是一种不同的类型。

你有几个选择。

  1. 只需附加到cObjArr
  2. ,而不是附加到arr

    https://play.golang.org/p/m3-83s6R5c

    1. 或遍历cObjArr并附加到arr
    2. https://play.golang.org/p/wvWaChcOWY

答案 1 :(得分:0)

首先,您应将arr声明为[]Type而不是[]*Type。您要放入数组的对象是Type,而不是*Type*Concrete实现Type接口。)

根据错误,您的代码必须尝试arr = cObjArr。您不能这样做,因为两个切片对象的类型不同。相反,您可以将cObj直接附加到arr