【问题标题】:Creating Slice from Reflected Type从反射类型创建切片
【发布时间】:2016-12-13 14:54:34
【问题描述】:

我正在尝试从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 的转换?

【问题讨论】:

标签: go reflection struct slice go-reflect


【解决方案1】:

不,你描述的不可能。不键入断言.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

【讨论】:

  • 但是,elemSlice 仍然是 reflect.Value 类型,如何得到它的实际切片类型?
  • elemSlice.Interface().([]TestStruct)
【解决方案2】:

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}]
}

【讨论】:

  • 所以对于#3,你仍然需要写出实际的单词“TestStruct”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多