我正在尝试创建一个可以重置传递的 slice 的函数,如下所示:
func resetSlice(slice interface{}) {
v := reflect.ValueOf(slice)
s := v.Type().Elem()
// QUESTION: How to reset the slice here?
}
usernames := []string{"Hello", "World"}
resetSlice(&usernames)
fmt.Println(usernames) // OUTPUT : [Hello World]
// EXPECTED: []
但是我不知道如何重置指针片。也许创建一个与指针 slice 具有相同类型的新 slice
reflect.New(v.Type().Elem())
然后更换指针 slice ?但是如何?
最佳答案
请改用reflect.MakeSlice
。
package main
import (
"fmt"
"reflect"
)
func resetSlice(slice interface{}) {
v := reflect.ValueOf(slice)
v.Elem().Set(reflect.MakeSlice(v.Type().Elem(), 0, v.Elem().Cap()))
}
func main() {
a := []string{"foo", "bar", "baz"}
resetSlice(&a)
fmt.Println(a)
}
https://play.golang.org/p/JNWE0hCsQp
关于pointers - 如何在Golang中使用反射包删除 slice 中的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44882827/