为了账号安全,请及时绑定邮箱和手机立即绑定

更改结构数组中对象值的最佳实践

更改结构数组中对象值的最佳实践

Go
Helenr 2023-02-14 15:20:44
我不知道这对于学习语言阶段是否必要,但请告诉我这个问题。我有一个结构数组var movies []Movie,我正在用 golang 构建一个 CRUD API 项目。当我开始编写对端点updateHandler的处理PUT请求/movies/{id}时,我忍不住想其他方法来更新 movies 数组中的对象。原来的方式(在教程视频中)是:// loop over the movies, range// delete the movie with the id that comes inside param// add a new movie - the movie that we send in the body of requestfor index, item := range movies {    if item.ID == params["id"] {        movies = append(movies[:index], movies[index+1:]...)        var updatedMovie Movie        json.NewDecoder(r.Body).Decode(&updatedMovie)        updatedMovie.ID = params["id"]        movies = append(movies, updatedMovie)        json.NewEncoder(w).Encode(updatedMovie)    }}但在我观看之前,我尝试编写自己的方法,如下所示:for index, item := range movies {    if item.ID == params["id"] {        oldMovie := &movies[index]        var updatedMovie Movie        json.NewDecoder(r.Body).Decode(&updatedMovie)        oldMovie.Isbn = updatedMovie.Isbn        oldMovie.Title = updatedMovie.Title        oldMovie.Director = updatedMovie.Director        json.NewEncoder(w).Encode(oldMovie) // sending back oldMovie because it has the id with it    }}如您所见,我将数组索引的指针分配给了一个名为 oldMovie 的变量。我也想过另一种方法,但不太顺利var updatedMovie Moviejson.NewDecoder(r.Body).Decode(&updatedMovie)// this linq package is github.com/ahmetalpbalkan/go-linq from hereoldMovie := linq.From(movies).FirstWithT(func(x Movie) bool {    return x.ID == params["id"]}).(Movie) // But here we'r only assigning the value not the reference(or address or pointer) // so whenever i try to get all movies it still returning // the old movie list not the updated oneoldMovie.Isbn = updatedMovie.IsbnoldMovie.Title = updatedMovie.TitleoldMovie.Director = updatedMovie.Directorjson.NewEncoder(w).Encode(oldMovie)在这里我脑子里想着一些事情是否有可能像最后一种方法那样做(我不能把 & 放在 linq 的开头)即使有什么方法是最好的做法?我应该像第一种方式那样做(删除我们要更改的结构并插入更新的结构)还是第二种方式(分配数组内部结构的地址并更改它)或与第二种方式相同的第三种方式(至少在我看来)但只是使用我喜欢阅读和写作的 linq 包?
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

您包含的第一个案例从切片中删除所选项目,然后附加新项目。这需要一个看似没有真正目的的潜在大 memmove。


第二种情况有效,但如果目的是替换对象的内容,则有一种更简单的方法:


for index, item := range movies {

    if item.ID == params["id"] {

        json.NewDecoder(r.Body).Decode(&movies[index])

        // This will send back the updated movie

        json.NewEncoder(w).Encode(&movies[index]) 

        // This will send back the old movie

        json.NewEncoder(w).Encode(item)

        break // Break here to stop searching

    }

}

第三个片段不返回指针,因此您不能修改切片。


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信