gpt4 book ai didi

go - 从类型断言的接口(interface) slice 中删除元素

转载 作者:IT王子 更新时间:2023-10-29 01:50:50 27 4
gpt4 key购买 nike

在 Golang 中,在对一个 slice 进行断言后,如何从该 slice 中删除一个元素?

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

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

最佳答案

如果你有一个包装在接口(interface)中的 slice 值,你就不能改变它。您不能更改包装在接口(interface)中的任何值。

当创建一个接口(interface)值来包装一个值时,会创建一个副本并将其存储在接口(interface)中。

当您对它进行类型断言时,您会得到该值的一个副本,但您不能在界面中更改该值。这就是为什么不允许为其分配一个值,就好像它是允许的,你只会为一个副本分配一个新值(你作为类型断言的结果获得)。但是存储在接口(interface)中的值不会被改变。

如果这确实是你想要的,那么你必须在接口(interface)中存储一个 slice 指针,例如*[]接口(interface){}。这不会改变您不能更改接口(interface)中的值的事实,但由于这次它是一个指针,我们不想更改指针,而是更改指向的值(即 slice 值)。

请看这个演示其工作原理的示例:

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”,现在在打印接口(interface)值时从结果中“消失”了。

关于go - 从类型断言的接口(interface) slice 中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47572782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com