从断言的类型中删除元素切片接口

时间:2017-11-30 11:47:37

标签: go interface slice type-assertion

在Golang中,在断言切片后,如何从所述切片中删除元素?

例如,以下内容返回错误cannot assign to value.([]interface {})

value.([]interface{}) = append(value.([]interface{})[:i],value.([]interface{})[i+1:]...)

1 个答案:

答案 0 :(得分:6)

如果您在界面中包含切片值,则无法对其进行更改。您无法更改接口中包含的任何值。

创建接口值以包装值时,将创建一个副本并将其存储在接口中。

当您键入断言时,您会获得该值的副本,但您无法更改接口中的值。这就是为什么它不被允许为它赋值,就像它被允许一样,你只会为一个副本分配一个新值(你作为类型断言的结果获得)。但存储在界面中的值将更改。

如果这确实是您想要的,那么您必须在界面中存储切片指针,例如*[]interface{}。这并没有改变你无法改变界面中的值的事实,但是从这次起它是一个指针,我们不想改变指针而是指向值(切片值)。

请参阅此示例,演示其工作原理:

s := []interface{}{0, "one", "two", 3, 4}

var value interface{} = &s

// Now do the removal:
sp := value.(*[]interface{})

i := 2
*sp = append((*sp)[:i], (*sp)[i+1:]...)

fmt.Println(value)

输出(在Go Playground上尝试):

&[0 one 3 4]

正如您所看到的,我们删除了索引为2的{​​{1}}元素,现在已经消失了#34}。从打印界面值时的结果。