英文:
Allow a slice of any type into as argument
问题
我是你的中文翻译助手,以下是你提供的代码的翻译:
我刚开始学习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
}
希望对你有帮助!
英文:
I am new to Go (coming from python) and I am having a bit of a hard time here. I am trying to allow any type of slice into my struct/func and it just contains a count of the length of that slice.
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
}
答案1
得分: 1
你可以使用interface{}
作为任何类型。
type Response struct {
Count int `json:"count"`
Results []interface{} `json:"results"`
}
更新
len(rsp.results)
应该可以工作。
http://play.golang.org/p/RA2zVzWl2q
英文:
you can use interface{}
as any type.
type Response struct {
Count int `json:"count"`
Results []interface{} `json:"results`
}
UPDATE
len(rsp.results)
should work.
http://play.golang.org/p/RA2zVzWl2q
答案2
得分: 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"`
}
英文:
Arbitrary types are totally legit in Go. In your case, it might be appropriate to use []interface{}
as the type of Results
. When ever the types need to be known, use type 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)
}
In case of JSON, *json.RawMessage
can be marshaled to type []byte
type Response struct {
Count int `json:"count"`
Results *json.RawMessage `json:"results`
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论