登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-17 09:18:27 253浏览 收藏

在 Go 中创建通用容器时,可以使用接口类型 (*[]interface{}) 存储任意类型的元素。然而,在将指向接口类型的指针分配给结构体字段时,可能会遇到编译时错误“incompleteassign”。 为了解决此问题,有两种方法: * 将字段类型从 *[]interface{} 更改为 interface{},前提是已完成数据处理且仅需将容器传递给客户端。 * 如果使用反射处理接口类型的数据,则可以将容器元素的类型显式指定为所需类型。

问题内容

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

type pagedstruct struct {
    elements *[]interface{}
    page     int16
    total    int16
}

其中包含一个指向数组的指针,该数组可以是任何类型。因为我的代码中有多个地方需要分页,所以这似乎是重用代码的明智解决方案。

但后来我尝试这样使用:

users := []User{
        User{1, "", "", "", ""},
    }
return &PagedStruct{&users, 1, 1}

它不起作用,说 incompleteassign 。在 google 上找不到好的解决方案。


正确答案


请注意,如果您已完成数据处理,并且只想将 pagedstruct 传递给客户端,并假设您通过使用 reflection 处理 interface{} 类型的数据来执行此操作,例如encoding/jsonhtml/template,那么您很可能只需将字段类型从 *[]interface{} 更改为 interface{}

type pagedstruct struct {
    data  interface{} `json:"data"`
    page  int16       `json:"page"`
    total int16       `json:"total"`
}
func listusers(w http.responsewriter, r *http.request) {
    users := []*user{
        // get users from db
    }

    page := pagedstruct{data: users, page: 1, total: 1}
    if err := json.newencoder(w).encode(page); err != nil {
        log.println(err)
    }
}

// or


func listusers(w http.responsewriter, r *http.request) {
    users := []*user{
        // get users from db
    }

    page := pagedstruct{data: users, page: 1, total: 1}
    if err := listuserstemplate.execute(w, page); err != nil {
        log.println(err)
    }
}

似乎工作正常:

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]]}
}

本篇关于《如何在 Go 中制作通用容器?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>