为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
GCT1015 2021-11-22 16:53:30
我是 Go 的新手(来自 python),我在这里遇到了一些困难。我试图允许任何类型的切片进入我的结构/函数,它只包含该切片长度的计数。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 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

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


type Response struct {

  Count int `json:"count"`

  Results []interface{} `json:"results`

}

更新


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


查看完整回答
反对 回复 2021-11-22
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

任意类型在 Go 中是完全合法的。在您的情况下,可能适合[]interface{}用作Results. 当需要知道类型时,请使用类型 switch。


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`

}


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信