如何在Go中制作通用容器?

如何在Go中制作通用容器?,go,Go,假设我需要在Go中实现分页。我需要传递一个包含元素和一些分页信息的结构。所以我想到了这个: type PagedStruct struct { elements *[]interface{} page int16 total int16 } 它包含指向可以是任何类型的数组的指针。因为我的代码中有不止一个地方需要分页,所以这似乎是重用代码的明智解决方案 但我试着用这样的方式: users := []User{ User{1, "&q

假设我需要在Go中实现分页。我需要传递一个包含元素和一些分页信息的结构。所以我想到了这个:

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种容器类型?在大多数情况下,您会发现实际上不需要泛型代码,并且可以使用已知的类型。