英文:
How to remove all the element in the slice with reflect package in Golang?
问题
我正在尝试创建一个函数,可以重置传递的切片,像这样:
func resetSlice(slice interface{}) {
v := reflect.ValueOf(slice)
s := v.Type().Elem()
// 问题:如何在这里重置切片?
}
usernames := []string{"Hello", "World"}
resetSlice(&usernames)
fmt.Println(usernames) // 输出:[Hello World]
// 期望:[]
但是我不知道如何重置指针切片。也许可以创建一个与指针切片具有相同类型的新切片,使用 reflect.New(v.Type().Elem())
,然后替换指针切片?但是如何实现呢?
英文:
I'm trying to create a function that can reset a passed slice like this:
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: []
But I have no idea about how to reset a pointer slice. Maybe create a new slice which has the same type as the pointer slice with
reflect.New(v.Type().Elem())
then replace the the pointer slice? But how?
答案1
得分: 4
使用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
英文:
use reflect.MakeSlice
instead.
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论