【问题标题】:Slice of pointers to a struct golang issue指向 struct golang 问题的指针切片
【发布时间】:2021-09-15 16:41:22
【问题描述】:

我的存储库层中有一个函数应该返回一个指针片段,但代码不能正常工作。

var books []model.Book

func GetBooksByGenre(genre string) []*model.Book {
    var response []*model.Book
    for _, ele := range books {
        if ele.Genre == genre {
            response = append(response, &ele)
        }
    }
    return response
}

我正在尝试遍历书籍列表,最后根据与输入类型匹配的书籍的genre 返回一个指针片段。

我调试并发现问题是由于 ele 得到更新并弄乱了 var response 中的现有指针

问题是,如果有 3 本书按照 genre 的顺序插入为 comedythrillerdrama,并且如果 GetBooksByGenregenre 为 @ 调用987654330@ 或 thriller,然后输出为 drama,因为这是我迭代列表时的最后一个条目。

我该如何解决这个问题?

【问题讨论】:

    标签: go pointers slice


    【解决方案1】:

    程序用变量ele 的地址填充切片。一种解决方法是使用切片元素的地址:

    func GetBooksByGenre(genre string) []*model.Book {
        var response []*model.Book
        for i, ele := range books {
            if ele.Genre == genre {
                response = append(response, &books[i])
            }
        }
        return response
    }
    

    另一个解决方法是将books 更改为[]*model.Book 而不是[]model.Book。将此代码用于该更改:

    func GetBooksByGenre(genre string) []*model.Book {
        var response []*model.Book
        for _, ele := range books {
            if ele.Genre == genre {
                response = append(response, ele)
            }
        }
        return response
    }
    

    另一个解决方法是为每次迭代创建一个新变量并使用该变量的地址:

    func GetBooksByGenre(genre string) []*model.Book {
        var response []*model.Book
        for _, ele := range books {
            if ele.Genre == genre {
                ele := ele // <-- new variable
                response = append(response, &ele)
            }
        }
        return response
    }
    

    您可能想要这里介绍的前两个选项之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2019-07-18
      • 2015-05-01
      • 2016-12-28
      • 2021-05-03
      • 2021-09-01
      相关资源
      最近更新 更多