Go 为什么在这个附加函数调用中需要三个点?
我正在按照教程学习Go中的RESTAPI。这是一段代码Go 为什么在这个附加函数调用中需要三个点?,go,Go,我正在按照教程学习Go中的RESTAPI。这是一段代码 func removeBook(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id, _ := strconv.Atoi(params["id"]) for i, item := range books { if item.ID == id { books = append(
func removeBook(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
for i, item := range books {
if item.ID == id {
books = append(books[:i], books[i+1:]...)
}
}
}
特别是这一部分books=append(books[:i],books[i+1:]…)
好的,append
将一个或多个项目追加到一个切片(在本例中,追加到books
,它是book
结构的切片)books[:i]
获取从开始到i
的所有内容,不包括i
。然后i+1
表示i
之后的下一项,在右侧添加冒号表示从那里到结尾的所有内容。因此,这意味着我们将获得所有项目,直到i
,不包括i
,然后是i
之后的所有项目。这意味着我们正在排除/删除i
,这就是removeBook
函数的要点
我有这么多的逻辑,但这三个点在那里做什么?我知道变量函数中使用了三个点,但是为什么我们在这个附加函数中需要三个点呢
当我删除这3个点时,我的编辑器说“不能使用books[I+1:](type[]Book的值)作为参数中的Book值来追加”
如果您想查看完整的代码,它位于。//append内置函数将元素追加到片段的末尾。如果
//它有足够的容量,目的地被重新许可以容纳
//新元素。否则,将分配一个新的底层数组。
//Append返回更新的切片。因此,有必要存储
//append的结果,通常在保存切片本身的变量中:
//slice=append(slice,elem1,elem2)
//切片=附加(切片,另一个切片…)
//作为一种特殊情况,将字符串附加到字节片是合法的,如下所示:
//slice=append([]字节(“hello”),“world”…)
func追加(切片[]类型,元素…类型)[]类型
因此,您只能追加元素,而不能追加整个片段。检查追加定义 在第二个参数中,它接受多个“元素” 在您给出的示例中,它本质上是将元素作为逗号分隔的参数列表传递 假设书的长度是10,我是7。然后它传递切片中的前7个元素(项目0到6),然后以逗号分隔的列表形式传递第8和第9个元素
books = append(books[:i], books[i+1:]...)
实际上是
books = append(books[:7], books[8], books[9])
添加整个切片。Append是一个可变函数
books = append(books[:7], books[8], books[9])