如何在Go中从for循环中返回接口列表?

huangapple go评论103阅读模式
英文:

How to return interface list from a for loop in Go?

问题

如何从Go的for循环中返回接口列表?

假设我有以下数据:

id name project_type
1 project_name 1
2 project_name 1
3 project_name 1
4 project_name 2
5 project_name 2
6 project_name 3
7 project_name 3
8 project_name 3
9 project_name 4
10 project_name 4

我可以使用以下Go代码获取project_type=1和project_type=2的两个列表:

  1. func (d *db) ProjectList(Type, uid string, size uint64) (interface{}, interface{}, error) {
  2. type resp struct {
  3. Name string `json:"name"`
  4. Id string `json:"id"`
  5. ProjectType string `json:"project_type"`
  6. }
  7. var project_type_1 []*resp
  8. var project_type_2 []*resp
  9. sql = fmt.Sprintf(sql, where.String())
  10. _, err := d.ctx.DB().SelectBySql("select * from project where project_type=1 order by rand() limit 10").Load(&project_type_1)
  11. _, err = d.ctx.DB().SelectBySql("select * from project where project_type=2 order by rand() limit 10").Load(&project_type_2)
  12. return project_type_1, project_type_2, err
  13. }

但是现在project_type的数据是一个JSON,格式为[{"project_type":1,"name":"something else"},{"project_type":2,"name":"something else"},{"project_type":3,"name":"something else"},{"project_type":4,"name":"something else"}],project_type的值超过2个,我需要获取一个接口{}列表。我尝试将代码重写如下,但是我不知道接下来该如何编写,如何从Go的for循环中返回接口列表?非常感谢任何建议。

  1. func NewProjectList(d *db) ([]interface{}, error) {
  2. var s = make([]ProjectType, 0)
  3. data, err := d.QueryString("project_type")
  4. if err != nil {
  5. return nil, err
  6. }
  7. err = json.Unmarshal([]byte(data), &s)
  8. if err != nil {
  9. return nil, err
  10. }
  11. for _, shortType := range s {
  12. fmt.Println("this is shortType", shortType)
  13. }
  14. return nil, err
  15. }
英文:

How to return interface list from a for loop in Go?
Supposed I have data as below:

id name project_type
1 project_name 1
2 project_name 1
3 project_name 1
4 project_name 2
5 project_name 2
6 project_name 3
7 project_name 3
8 project_name 3
9 project_name 4
10 project_name 4

I can use the below go code to get two list of project_type=1 and project_type=2,

  1. func (d *db) ProjectList(Type, uid string, size uint64) (interface{}, interface{}, error) {
  2. type resp struct {
  3. Name string `json:"name"`
  4. Id string `json:"id"`
  5. ProjectType string `json:"project_type"`
  6. }
  7. var project_type_1 []*resp
  8. var project_type_2 []*resp
  9. sql = fmt.Sprintf(sql, where.String())
  10. _, err := d.ctx.DB().SelectBySql("select * from project where project_type=1 order by rand() limit 10").Load(&project_type_1)
  11. _, err = d.ctx.DB().SelectBySql("select * from project where project_type=2 order by rand() limit 10").Load(&project_type_2)
  12. return project_type_1, project_type_2, err
  13. }

But now the data of project_type is a JSON of [{"project_type":1,"name":"something else"},{"project_type":2,"name":"something else"},{"project_type":3,"name":"something else"},{"project_type":4,"name":"something else"}], project_type is more than 2, I have to get a interface{} list, I tried to re-write code as below, But I don't know how do write next, How to return interface list from a for loop in Go?, thanks so much for any advice.

  1. func NewProjectList(d *db) ([]interface{}, error) {
  2. var s = make([]ProjectType, 0)
  3. data, err := d.QueryString("project_type")
  4. if err != nil {
  5. return nil, err
  6. }
  7. err = json.Unmarshal([]byte(data), &s)
  8. if err != nil {
  9. return nil, err
  10. }
  11. for _, shortType := range s {
  12. fmt.Println("this is shortType", shortType)
  13. }
  14. return nil, err
  15. }

答案1

得分: 1

如果你想让每个project_type都有10个结果(总共10*n个结果):

  1. func (d *db) ProjectList(Type, uid string, size uint64) ([]interface{}, error) {
  2. type resp struct {
  3. Name string `json:"name"`
  4. Id string `json:"id"`
  5. ProjectType string `json:"project_type"`
  6. }
  7. // 获取所有类型,你可以从数据库中获取
  8. // 例如:select DISTINCT ProjectType from project
  9. types := []string{"1", "2", "3", "4"}
  10. ans := []interface{}{}
  11. for _, sType := range types {
  12. var project_type []*resp
  13. sql := fmt.Sprintf("select * from project where project_type=%s order by rand() limit 10", sType)
  14. _, err := d.ctx.DB().SelectBySql(sql).Load(&project_type)
  15. ans = append(ans, project_type)
  16. }
  17. return ans, nil
  18. }

如果所有类型总共只有10个结果:

  1. // 如果需要,我可以为你编写这部分代码
英文:

if you want each project_type have 10 results(all 10*n results):

  1. func (d *db) ProjectList(Type, uid string, size uint64) ([]interface{}, error) {
  2. type resp struct {
  3. Name string `json:"name"`
  4. Id string `json:"id"`
  5. ProjectType string `json:"project_type"`
  6. }
  7. // get all types, you can get it from db
  8. // example: select DISTINCT ProjectType from project
  9. types := []string{"1", "2", "3", "4"}
  10. ans := []interface{}{}
  11. for _, sType := range types {
  12. var project_type []*resp
  13. sql = fmt.Sprintf(sql, where.String())
  14. _, err := d.ctx.DB().SelectBySql("select * from project where project_type=" + sType + " order by rand() limit 10").Load(&project_type)
  15. ans = append(ans, project_type)
  16. }
  17. return ans, nil
  18. }

if A total of 10 results for all types:

  1. i write it if you need it

huangapple
  • 本文由 发表于 2023年3月17日 15:10:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/75764651.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定