2017-07-03 149 views
0

我试图创建一个可以重置通过切片这样的功能:如何用Golang中的反射包去除切片中的所有元素?

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: [] 

但我不知道如何重置指针片的想法。也许创建一个与指针切片类型相同的新切片

reflect.New(v.Type().Elem()) 

然后替换指针切片?但是如何?

回答

2

改为使用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