2016-08-07 46 views
0

我试图从reflect.Type创建切片。这是我迄今为止所拥有的。从反射型创建切片

package main 

import (
    "fmt" 
    "reflect" 
) 

type TestStruct struct { 
    TestStr string 
} 

func main() { 
    elemType := reflect.TypeOf(TestStruct{}) 

    elemSlice := reflect.New(reflect.SliceOf(elemType)).Interface() 

    elemSlice = append(elemSlice, TestStruct{"Testing"}) 

    fmt.Printf("%+v\n", elemSlice) 

} 

但是我碰到下面的错误,我不知道如何避开它没有硬编码转换到[]TestStruct

prog.go:17: first argument to append must be slice; have interface {} 

反正是有治疗返回的接口为切片,而不必从interface{}转换硬编码到[]TestStruct

+0

这更符合我所寻找的内容。 http://stackoverflow.com/questions/25384640/why-golang-reflect-makeslice-returns-un-addressable-value – moesef

回答

2

不,你描述的是不可能的。不包括.Interface()的结果限制了你可以做的事情。你最好的机会是继续与reflect.Value价值的工作:

package main 

import (
    "fmt" 
    "reflect" 
) 

type TestStruct struct { 
    TestStr string 
} 

func main() { 
    elemType := reflect.TypeOf(TestStruct{}) 

    elemSlice := reflect.MakeSlice(reflect.SliceOf(elemType), 0, 10) 

    elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"})) 

    fmt.Printf("%+v\n", elemSlice) 

} 

https://play.golang.org/p/WkGPjv0m_P

1

1-使用reflect.MakeSlice(reflect.SliceOf(elemType), 0, 10)
reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"}))
像这样的工作示例代码:

package main 

import "fmt" 
import "reflect" 

func main() { 
    elemType := reflect.TypeOf(TestStruct{}) 
    elemSlice := reflect.MakeSlice(reflect.SliceOf(elemType), 0, 10) 
    elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"})) 
    fmt.Println(elemSlice) // [{Testing}] 

} 

type TestStruct struct { 
    TestStr string 
} 

2-使用reflect.New(reflect.SliceOf(elemType)).Elem()
elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"}))
像这样的工作示例代码:

package main 

import "fmt" 
import "reflect" 

type TestStruct struct { 
    TestStr string 
} 

func main() { 
    elemType := reflect.TypeOf(TestStruct{}) 
    elemSlice := reflect.New(reflect.SliceOf(elemType)).Elem() 
    elemSlice = reflect.Append(elemSlice, reflect.ValueOf(TestStruct{"Testing"})) 

    fmt.Printf("%+v\n", elemSlice) // [{TestStr:Testing}] 
    fmt.Println(elemSlice)   // [{Testing}] 
} 

输出:

[{TestStr:Testing}] 
[{Testing}] 

3-如果需要append,唯一的办法就是使用s := elemSlice.([]TestStruct),像这样的工作样品代码:

package main 

import "fmt" 
import "reflect" 

type TestStruct struct { 
    TestStr string 
} 

func main() { 
    elemType := reflect.TypeOf(TestStruct{}) 
    elemSlice := reflect.New(reflect.SliceOf(elemType)).Elem().Interface() 

    s := elemSlice.([]TestStruct) 
    s = append(s, TestStruct{"Testing"}) 

    fmt.Printf("%+v\n", elemSlice) // [] 
    fmt.Println(s)     // [{Testing}] 
}