在Golang中,在断言切片后,如何从所述切片中删除元素?
例如,以下内容返回错误cannot assign to value.([]interface {})
value.([]interface{}) = append(value.([]interface{})[:i],value.([]interface{})[i+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}。从打印界面值时的结果。