go 获取slice中的结构体
时间: 2024-03-27 07:38:25 浏览: 138
Go语言中slice作为参数传递时遇到的一些“坑”
在 Go 中,可以使用反射(reflect)包来获取 slice 中的结构体。具体来说,可以使用 reflect.ValueOf 函数获取 slice 的值,然后使用 reflect.TypeOf 函数获取 slice 中元素的类型,最后使用 reflect.New 函数创建该类型的实例,并使用 reflect.Append 函数将其添加到结果列表中。
下面是一个示例代码,演示如何获取一个结构体 slice 中的结构体:
```go
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func main() {
var people []Person = []Person{
{Name: "Alice", Age: 18},
{Name: "Bob", Age: 20},
{Name: "Charlie", Age: 22},
}
result := make([]Person, 0)
sliceValue := reflect.ValueOf(people)
for i := 0; i < sliceValue.Len(); i++ {
structValue := sliceValue.Index(i)
structType := structValue.Type()
if structType.Kind() == reflect.Struct {
newStructValue := reflect.New(structType).Elem()
newStructValue.Set(structValue)
result = append(result, newStructValue.Interface().(Person))
}
}
fmt.Println(result)
}
```
输出结果为:
```
[{Alice 18} {Bob 20} {Charlie 22}]
```
需要注意的是,在获取结构体时,如果结构体中有非导出字段,使用反射获取可能会失败。因为非导出字段对于反射包来说是不可访问的,这种情况下,需要将非导出字段改为导出字段。
阅读全文