2015-11-17 3 views
0

Я новичок в Go (исходит из python), и мне здесь немного тяжело. Я пытаюсь разрешить любой тип среза в моей структуре/func, и он просто содержит счетчик длины этого среза.Разрешить кусочек любого типа в качестве аргумента

import "go/types" 

type Response struct { 
    Count int `json:"count"` 
    Results []types.Struct `json:"results` 
} 

func NewResponse(results []types.Struct) (r *Response) { 
    r.Count = len(results) 
    r.Results = results 
    return 
} 
+0

Что об использовании 'json.RawMessage' как тип для каждого результата, так как вы, кажется, не знает JSON структура результатов перед фронтом. Например. http://play.golang.org/p/jEx4UgBnLP. –

+2

Пакет go/types не может использоваться для таких вещей. Редизайн вашего решения: все эти идеи «любого типа» не очень хорошо работают в Go. Редизайн. Это работает. – Volker

ответ

1

Вы можете использовать interface{} как любой тип.

type Response struct { 
    Count int `json:"count"` 
    Results []interface{} `json:"results` 
} 

UPDATE

len(rsp.results) должен работать. http://play.golang.org/p/RA2zVzWl2q

+0

Невозможно назвать 'len (results)', если это интерфейс. – electrometro

+0

@electrometro: вы можете использовать отражение, чтобы получить длину. – newacct

0

Произвольные типы полностью законны в Го. В вашем случае может быть целесообразно использовать []interface{} как тип Results. Когда все типы должны быть известны, используйте переключатель .

package main 

import (
    "fmt" 
) 

type Response struct { 
    Count int   `json:"count"` 
    Results []interface{} `json:"results` 
} 

func NewResponse(results []interface{}) (r *Response) { 
    r.Count = len(results) 
    r.Results = results 
    return 
} 

func AssertResultType(results []interface{}) { 

    for _, v := range results { 
     switch v := v.(type) { 
     default: 
      fmt.Printf("unexpected type %T\n", v) //t has unexpected type 
     case bool: 
      fmt.Printf("boolean %t\n", v) // t has type bool 
     case int: 
      fmt.Printf("integer %d\n", v) // t has type int 
     case string: 
      fmt.Printf("string %q\n", v) // t has type string 
     } 
    } 

} 

func main() { 

    args := []interface{}{1, "hello", true, "foo", 21}  

    r := NewResponse(args) 

    AssertResultType(r.Results) 
} 

В случае JSON, *json.RawMessage может быть маршалируются типа []byte

type Response struct { 
    Count int    `json:"count"` 
    Results *json.RawMessage `json:"results` 
} 
Смежные вопросы