返回

小试牛刀:Go 反射赋能 Excel 转 Struct

后端

作为一名后端开发人员,我们经常需要处理各种不同的数据格式,其中 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/csvfmtlogosreflect 库。我们还定义了一个 Person 结构体,它包含三个字段:NameAgeJob

接下来,我们需要创建一个函数来读取 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