pointers - 如何在Golang中使用反射包删除 slice 中的所有元素?

标签 pointers go reflection slice

我正在尝试创建一个可以重置传递的 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/

相关文章:

go - 我可以别名函数的返回类型吗

java - 为什么 Java 反射调用比方法调用快?

空指针和指向函数指针的指针之间的转换

c - 将结构添加到 C 中的数组

http - 是否可以从 http Handle 函数写入 channel ?

Golang多维 slice 复制

java - 获取原始类型的默认值

java - 如何获取内部泛型类型使用的注释?

c++ - 分配给派生类的基类指针

c - C 的指针错误