【问题标题】:Removing an element from a type asserted Slice of interfaces从类型断言的接口切片中删除元素
【发布时间】:2017-11-30 11:47:36
【问题描述】:
在 Golang 中,断言切片后,如何从切片中删除元素?
例如以下返回错误cannot assign to value.([]interface {})
value.([]interface{}) = append(value.([]interface{})[:i],value.([]interface{})[i+1:]...)
【问题讨论】:
标签:
go
interface
slice
type-assertion
【解决方案1】:
如果你有一个封装在接口中的切片值,你就不能改变它。您不能更改 任何 封装在接口中的值。
当创建一个接口值来包装一个值时,会制作一个副本并将其存储在接口中。
当你 type-assert 时,你会得到一个值的副本,但你不能在界面中更改值 in。这就是为什么不允许为其分配值的原因,就好像它被允许一样,您只会为副本分配一个新值(您作为类型断言的结果获得)。但是存储在接口中的值不会改变。
如果这确实是你想要的,那么你必须在接口中存储一个切片指针,例如*[]interface{}。这并没有改变你不能改变接口中的值的事实,但是由于这次是指针,我们不想改变指针而是 pointed 值(即切片值)。
看这个例子来展示它是如何工作的:
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 处的元素,它是 "two",现在在打印接口值时从结果中“消失”了。