登录
首页 >  Golang >  Go问答

删除切片中的元素

来源:stackoverflow

时间:2024-02-29 20:00:24 315浏览 收藏

本篇文章给大家分享《删除切片中的元素》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我想删除切片中的项目,而无需对切片中的每种类型的项目使用特定的函数。因此,我使用 interface{} 作为切片项类型:

package main

import "fmt"

func sliceremoveitem(slice []interface{}, s int) []interface{} {
  return append(slice[:s], slice[s+1:]...)
}

func main() {
  array := []int{1,2,3,4,5,6,7}

  fmt.println(array)
  fmt.println(sliceremoveitem(array,1))
}

但是 golang 不喜欢它:

./prog.go:13:30: cannot use array (type []int) as type []interface {} in argument to sliceRemoveItem

https://play.golang.org/p/wurr5igrz5y

知道如何做到这一点吗?是否可以使用接受任何类型的切片项的通用单个函数?

参考:如何从 golang 的 slice 中删除元素


解决方案


您正在尝试将 int 的切片作为 interface{} 的切片传递。 go 不会隐式执行此转换,因为这是一项成本高昂的操作。

看看这个答案:https://stackoverflow.com/a/12754757

您可以接受 []interface{},但显式进行转换,或者将类型指定为 []int。这有效:

package main

import "fmt"

func sliceremoveitem(slice []int, s int) []int {
  return append(slice[:s], slice[s+1:]...)
}

func main() {
  array := []int{1,2,3,4,5,6,7}

  fmt.println(array)
  fmt.println(sliceremoveitem(array,1))
}

使用反射包。

// sliceremoveitem removes item at index i from the
// slice pointed to by slicep.
func sliceremoveitem(slicep interface{}, i int) {
    v := reflect.valueof(slicep).elem()
    v.set(reflect.appendslice(v.slice(0, i), v.slice(i+1, v.len())))
}

这样称呼它:

slice := []int{1, 2, 3, 4, 5, 6, 7}
sliceRemoveItem(&slice, 1)

为了避免调用者中的类型断言,该函数使用指向切片参数的指针。

Run it on the Go playground

以上就是《删除切片中的元素》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>