如何在Go中制作通用容器?
假设我需要在Go中实现分页。我需要传递一个包含元素和一些分页信息的结构。所以我想到了这个:如何在Go中制作通用容器?,go,Go,假设我需要在Go中实现分页。我需要传递一个包含元素和一些分页信息的结构。所以我想到了这个: type PagedStruct struct { elements *[]interface{} page int16 total int16 } 它包含指向可以是任何类型的数组的指针。因为我的代码中有不止一个地方需要分页,所以这似乎是重用代码的明智解决方案 但我试着用这样的方式: users := []User{ User{1, "&q
type PagedStruct struct {
elements *[]interface{}
page int16
total int16
}
它包含指向可以是任何类型的数组的指针。因为我的代码中有不止一个地方需要分页,所以这似乎是重用代码的明智解决方案
但我试着用这样的方式:
users := []User{
User{1, "", "", "", ""},
}
return &PagedStruct{&users, 1, 1}
它不起作用,说不相容的符号。在谷歌上找不到解决此问题的好方法。似乎效果不错:
package main
import "fmt"
type (
user []interface{}
page struct {
elements []user
}
)
func main() {
users := []user{
{1, "south"}, {2, "north"},
}
p := page{users}
fmt.Printf("%+v\n", p) // {elements:[[1 south] [2 north]]}
}
请注意,如果您处理完数据后只想将
PagedStruct
传递给客户机,并且假设您是通过使用某种类型的interface{}
来处理数据的,例如,或者,那么您最有可能需要的就是将字段的类型从*[]interface{}更改为
到接口{}
类型PagedStruct struct{
数据接口{}`json:“数据”`
页面int16`json:“页面”`
Total int16`json:“Total”`
}
func列表用户(w http.ResponseWriter,r*http.Request){
用户:=[]*用户{
//从数据库获取用户
}
页面:=页面结构{数据:用户,页面:1,总计:1}
如果err:=json.NewEncoder(w).Encode(第页);err!=nil{
log.Println(错误)
}
}
//或
func ListUsers(w http.ResponseWriter,r*http.Request){
用户:=[]*用户{
//从数据库获取用户
}
页面:=页面结构{数据:用户,页面:1,总计:1}
如果错误:=listUsersTemplate.Execute(w,第页);错误!=nil{
log.Println(错误)
}
}
。由于接口{}
并不意味着“任何类型”,因此[]接口{}
并不意味着“任何类型的一个片段”。不要使用指向切片的指针。2.阅读围棋常见问题解答。3.Go中这样的泛型/多态代码的问题是,在演示数据类型的实际使用方法之前,不可能对设计提供合理的指导。那么,什么是好的解决方案呢?(而不是否决我的问题…)最有可能的原因是,这一点已经在这里和其他地方得到了广泛的讨论,默认的否决理由是缺乏研究。没有任何示例数据,它也过于宽泛,因为在运行时有许多可能的模式来处理类型。对于存储任何类型的容器的一些示例,您是否查看了标准库中的3种容器类型?在大多数情况下,您会发现实际上不需要泛型代码,并且可以使用已知的类型。