Как преобразовать интерфейс в срез интерфейса? - PullRequest
0 голосов
/ 24 сентября 2018

Мой ввод - interface{}, и я знаю, что это может быть массив любого типа.

Я хотел бы прочитать один из элементов моего ввода, поэтому я пытаюсь преобразовать свой interface{} в []interface{}, но go выдаст мне следующую ошибку:

паника: преобразование интерфейса: интерфейс {} is [] map [string] int, а не [] interface {}

Как я могу сделать это преобразование?(без отражения, если возможно).

Тест на игровую площадку

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Цель интерфейса - определить поведение, которое вы хотите использовать. Если вы используете пустой интерфейс, вы ничего не знаете о типах в этом срезе.

Если вы хотите распечатать его, вы можете использовать println или printf без преобразования.

Если вы хотите получить к нему доступ и должны разрешить любой тип, вы можете использовать отражение (медленно и сложноиспользовать).

Если вы хотите получить к нему доступ и использовать общее поведение / данные, для которых вы можете определить функции, определите интерфейс, например:

type Doer interface {
 Do() error
}
parentStruct := []Doer{...}
testStruct.Do()

Если ничего из этого не работаетДождись Go 2 и дженериков.

0 голосов
/ 24 сентября 2018

Я думаю, вы ищете утверждение типа

package main

import (
    "fmt"
)

func main() {

    parentStruct := map[string]interface{}{
         "test": []map[string]int{
          {"a": 1, "b": 2},
          {"c": 3},
        },
   }

   testStruct := parentStruct["test"].([]map[string]int)

   fmt.Println(testStruct)
}

прочитайте эту ссылку: https://golang.org/ref/spec#Type_assertions

https://play.golang.org/p/81uL2hgrN3l

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...