允许任何类型的切片作为参数

时间:2015-11-17 06:03:28

标签: struct go types arguments slice

我是Go的新手(来自python),我在这里遇到了一些困难。我试图允许任何类型的切片进入我的struct / 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
}

2 个答案:

答案 0 :(得分:1)

您可以将interface{}用作任何类型。

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

<强>更新

len(rsp.results)应该有效。 http://play.golang.org/p/RA2zVzWl2q

答案 1 :(得分:0)

任意类型在Go中完全合法。在您的情况下,使用[]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`
}