小试牛刀:Go 反射赋能 Excel 转 Struct
2023-10-10 13:47:21
作为一名后端开发人员,我们经常需要处理各种不同的数据格式,其中 Excel 格式是比较常见的一种。
如果我们需要将 Excel 中的数据读入到我们的 Go 程序中,一种常用的方法是使用第三方库,例如 github.com/360EntSecGroup-Skylar/excelize
。这个库提供了丰富的 API,可以方便地读取和写入 Excel 文件。
但是,如果您希望更灵活地控制数据的转换过程,您可以使用 Go 反射机制来实现。反射机制允许您在运行时查询和操作类型信息,从而可以动态地创建和修改数据结构。
在本教程中,我们将向您展示如何使用 Go 反射机制将 Excel 中的数据转换为 Struct,从而实现类似于 json.Unmarshal
的功能。
准备工作
在开始之前,您需要确保已经安装了 Go 和一个文本编辑器。您还需要下载并安装 github.com/360EntSecGroup-Skylar/excelize
库。
代码实现
现在,让我们开始编写代码。首先,我们需要创建一个新的 Go 项目。您可以使用以下命令创建一个新的项目:
go mod init excel2struct
接下来,我们需要导入必要的库。在 main.go
文件中,添加以下代码:
package main
import (
"encoding/csv"
"fmt"
"log"
"os"
"reflect"
"github.com/360EntSecGroup-Skylar/excelize"
)
type Person struct {
Name string
Age int
Job string
}
在上面的代码中,我们导入了 encoding/csv
、fmt
、log
、os
和 reflect
库。我们还定义了一个 Person
结构体,它包含三个字段:Name
、Age
和 Job
。
接下来,我们需要创建一个函数来读取 Excel 文件中的数据。在 main.go
文件中,添加以下代码:
func readExcel(path string) ([][]string, error) {
f, err := excelize.OpenFile(path)
if err != nil {
return nil, err
}
sheetName := f.GetSheetName(0)
rows, err := f.GetRows(sheetName)
if err != nil {
return nil, err
}
return rows, nil
}
在上面的代码中,我们定义了一个名为 readExcel
的函数,它接受一个 Excel 文件的路径作为参数,并返回一个包含所有行的二维字符串数组。
接下来,我们需要创建一个函数来将 Excel 中的数据转换为 Struct。在 main.go
文件中,添加以下代码:
func excelToStruct(rows [][]string) []Person {
var people []Person
for _, row := range rows {
if len(row) < 3 {
continue
}
person := Person{
Name: row[0],
Age: toInt(row[1]),
Job: row[2],
}
people = append(people, person)
}
return people
}
func toInt(s string) int {
i, err := strconv.Atoi(s)
if err != nil {
return 0
}
return i
}
在上面的代码中,我们定义了一个名为 excelToStruct
的函数,它接受一个包含所有行的二维字符串数组作为参数,并返回一个包含所有人的 Person
结构体数组。
toInt
函数将字符串转换为整数。
现在,我们可以编写主函数来测试我们的代码。在 main.go
文件中,添加以下代码:
func main() {
rows, err := readExcel("people.xlsx")
if err != nil {
log.Fatal(err)
}
people := excelToStruct(rows)
for _, person := range people {
fmt.Println(person)
}
}
在上面的代码中,我们首先调用 readExcel
函数来读取 Excel 文件中的数据。然后,我们调用 excelToStruct
函数将 Excel 中的数据转换为 Person
结构体数组。最后,我们循环遍历 Person
结构体数组并打印每个人的信息。
运行以下命令来运行程序:
go run main.go
您应该会看到类似于以下的输出:
{John Doe 25 Software Engineer}
{Jane Smith 30 Manager}
{Michael Jones 40 CEO}
总结
在本教程中,我们向您展示了如何使用 Go 反射机制将 Excel 中的数据转换为 Struct。这是一种非常灵活的方法,可以用于各种不同的数据转换任务。
如果您有兴趣了解更多关于 Go 反射的信息,您可以查看官方文档:https://go.dev/ref/reflect