【问题标题】: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",现在在打印接口值时从结果中“消失”了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 2016-09-16
      • 2016-03-10
      • 2021-08-10
      • 2023-04-03
      相关资源
      最近更新 更多