首页 > 解决方案 > 从数组创建结构

问题描述

我有一个Employee struct看起来像这样的:

type Employee struct {
  firstName string
  lastName  string
  role      string
}

我从 Excel 文件中读取了一行,其中对应的列的顺序相同。从 excel 文件中,我创建了一个包含此数据的数组,因此该数组如下所示:

[personFirstName, personLastName, personRole]

我想用它初始化我的 Employee 结构。但我不知道怎么做,因为我不能像数组一样遍历 Employee 结构。我想过手动做,像这样:

e := {
  firstName: array[0],
  lastName: array[1],
  role: array[2],
}

但我想应该有更好的方法。有任何想法吗?

标签: go

解决方案


问题中的代码没有任何问题。以下是如何使用反射 API 来实现目标:

导出字段以通过反射 API 使字段可设置。

type Employee struct {
    FirstName string
    LastName  string
    Role      string
}

为员工创造反映价值。&需要和Elem() 恶作剧才能获得可设置的值。

var e Employee
v := reflect.ValueOf(&e).Elem()

对于每个字段,设置字符串:

for i := 0; i < v.NumField(); i++ {
    v.Field(i).SetString(values[i])
}

在 Go Playground 上运行一个示例

如果您在多个地方需要它,请将代码放在一个函数中:

// setStrings sets the fields of the struct pointed 
// to by ptr to the specified values.
func setStrings(ptr interface{}, values []string) {
    v := reflect.ValueOf(ptr).Elem()
    for i := 0; i < v.NumField(); i++ {
        v.Field(i).SetString(values[i])
    }
}

像这样称呼它:

values := []string{"Monica", "Smith", "Manager"}
var e Employee
setStrings(&e, values)
fmt.Printf("%+v\n", e) // prints {FirstName:Monica LastName:Smith Role:Manager} 

在操场上运行一个示例


推荐阅读