从数组创建结构

时间:2021-06-28 17:10:21

标签: go

我有一个 Ç3Ç5278260051Ç557065100415Ç5278260051ÇÇÇÇÇÇÇ 看起来像这样:

Employee struct

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

type Employee struct { firstName string lastName string role string }

我想用它初始化我的 Employee 结构。 但我不知道怎么做,因为我无法像数组一样遍历 Employee 结构。 我想过手动完成,如下所示:

[personFirstName, personLastName, personRole]

但我想应该有更好的方法。 有什么想法吗?

2 个答案:

答案 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} 

Run an example on the playground

答案 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"}
相关问题