2016-02-09 4 views
2

Я довольно новичок в Go, но очень стараюсь ..golang, Как подсчитать элементы в интерфейсе типа структуры {}?

Я пытаюсь написать некоторый логик, который должен проверить, является ли атрибут struct состоящим только из одного элемента, или первый элемент имеет только один ребенок.

Главная структура такова:

type ChartOptins struct { 
    Filters Filter `json:"filters"` 
    Charts interface{} `json:"charts"` 
} 

Графики прирожденный состав массивов структуры, как это:

$filters = array(
     "filters" => array(
      "DayStart" => "12-01-2015", 
      "DayEnd" => "12-05-2015", 
      "TimePeriods"=> array(
       array("qqq","www"), 
      ), 
      "lines" => array(
       "first","avokado","drunduki" 
      ) 

     ), 
     "charts" => array(
      "noagg" => array(
       array(
        "name" => "HOLD", 
        "type" => "line" 
       ), 
       array(
        "name" => "UKKR", 
        "type" => "line" 
       ), 
       array(
        "name" => "SVO", 
        "type" => "line" 
       ), 
      ), 
      "oracle" => array(
       array(
        "name" => "TDD", 
        "type" => "line" 
       ), 
      ) 
     ), 
    ); 

в stuct ChartOptions я разобрать запрос JSON от POST. JSON выглядит следующим образом:

{ "filters": { "dayStart": "11-10-2015", "dayEnd": "21-10-2015", "timePeriods": [ [ "qqq", "www" ] ], "lines": [ "first", "avokado", "drunduki" ] }, "charts": { "noagg": [ { "name": "HOLD", "type": "line" } ] } } 

Так, charts может иметь только один источник и 1 элемент в ней, или любое количество элементов в любом количестве источников.

"charts" : { "noagg": [ { "name": "HOLD", "type": "line" } ] } 
or 
"charts" : { "noagg": [ { "name": "HOLD", "type": "line" } , { "name": "TDD", "type": "line" } , { "name": "SVO", "type": "line" } ] } 

из задних, это и есть элементы JSON, что приходит идти сценарий, и я разобрать их в интерфейсе {}. Когда я попытался использовать len(), Go сказал, что я не могу использовать его на интерфейсе.

Какова наилучшая практика для работы с количеством элементов и какой лучший способ достичь такой проверки?

+0

попробуйте использовать пакет 'reflect' – sfault

+0

можете ли вы привести несколько примеров? – Altenrion

+0

Не анализируйте '' '' terface {} '(который вы не должны использовать, если новый для Go в любом случае), но в какую-то подходящую структуру с noagg-срезом и сделать' len' на этом фрагменте. – Volker

ответ

2

Как я понимаю, вам просто нужно определить структуры для правильного отображения json. Это может быть, как это:

package main 

import (
    "encoding/json" 
    "fmt" 
    "strings" 
) 

type ChartOptins struct { 
    Filters map[string]interface{} `json:"filters"` 
    Charts map[string][]Chart  `json:"charts"` 
} 

type Chart struct { 
    Name string `json:"name"` 
    Type string `json:"type"` 
} 

func main() { 
    const jsonStream = `{ 
     "filters": { "dayStart": "oneortwo", "dayEnd": "oneorthree", "timePeriods": [ [ "qqq", "www" ] ], "lines": [ "first", "avokado", "drunduki" ] }, 
     "charts": { "noagg": [ { "name": "HOLD", "type": "line" }, { "name": "UKKR", "type": "line" }, { "name": "SVO", "type": "line" } ], "oracle": [ { "name": "TDD", "type": "line" } ] } 
    }` 

    var co ChartOptins 
    json.NewDecoder(strings.NewReader(jsonStream)).Decode(&co) 

    fmt.Println(co) 

    for k, v := range co.Charts { 
     fmt.Printf("key: %v\n", k) 
     for _, ch := range v { 
      fmt.Printf("Name: %v, type: %v\n", ch.Name, ch.Type) 
     } 
    } 
} 
+0

Мне нужно, чтобы имя источника было динамическим, поэтому я использовал интерфейс. Я обнаружил, что '' 'map [string] Charts''' можно использовать, но теперь я получаю erros, что массив не может быть проанализирован в мои новые структуры. Имя« source »может быть x, y, .. ., n, и может быть несколько источников за один момент. – Altenrion

+0

Сделал некоторые изменения, размещенные на вопрос – Altenrion

+0

Можете ли вы отправить динамическое имя объекта в дополнительное поле json? Вы знаете структуру этого объекта? – wlredeye

2

Вот интерфейс Exemple учета: https://play.golang.org/p/Eu6Hj6ddSE

Просто измените: Charts interface{} ведьма Charts []interface{} если v это вы ChartOptins то, чтобы получить ваше использование LEN() оператор в. интерфейс

fmt.Println(len(v.Charts.([]interface{}))) 
Смежные вопросы