我有一个 Ç3Ç5278260051Ç557065100415Ç5278260051ÇÇÇÇÇÇÇ
看起来像这样:
Employee struct
我从 Excel 文件中读取了一行,该行具有相同顺序的相应列。 我从 excel 文件中创建了一个包含这些数据的数组,因此该数组如下所示:
type Employee struct {
firstName string
lastName string
role string
}
我想用它初始化我的 Employee 结构。 但我不知道怎么做,因为我无法像数组一样遍历 Employee 结构。 我想过手动完成,如下所示:
[personFirstName, personLastName, personRole]
但我想应该有更好的方法。 有什么想法吗?
答案 0 :(得分:-1)
问题中的代码没有任何问题。以下是如何使用反射 API 来实现目标:
Export 使字段可通过反射 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])
}
Run an example on the 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}
答案 1 :(得分:-2)
根据建议,您可以使用 reflect
迭代结构字段:
package main
import (
"fmt"
"reflect"
)
type Employee struct {
FirstName string
LastName string
Role string
}
func setStrings(empPtr interface{}, values []string) {
v := reflect.ValueOf(empPtr).Elem()
for i := 0; i < v.NumField(); i++ {
v.Field(i).SetString(values[i])
}
}
func main() {
values := []string{"Monica", "Smith", "Manager"}
var emp Employee
setStrings(&emp, values)
fmt.Printf("%#v", emp)
}
输出:
main.Employee{FirstName:"Monica", LastName:"Smith", Role:"Manager"}