我是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
}
答案 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`
}