我不知道这对于学习语言阶段是否必要,但请告诉我这个问题。
我有一个结构数组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 request
for 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 Movie
json.NewDecoder(r.Body).Decode(&updatedMovie)
// this linq package is github.com/ahmetalpbalkan/go-linq from here
oldMovie := 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 one
oldMovie.Isbn = updatedMovie.Isbn
oldMovie.Title = updatedMovie.Title
oldMovie.Director = updatedMovie.Director
json.NewEncoder(w).Encode(oldMovie)
在这里我脑子里想着一些事情是否有可能像最后一种方法那样做(我不能把 & 放在 linq 的开头)即使有什么方法是最好的做法?
我应该像第一种方式那样做(删除我们要更改的结构并插入更新的结构)还是第二种方式(分配数组内部结构的地址并更改它)或与第二种方式相同的第三种方式(至少在我看来)但只是使用我喜欢阅读和写作的 linq 包?
慕桂英3389331
相关分类