英文:
Go - converting ...interface{} to a struct
问题
我有一个场景,我正在调用一个函数,利用一个常见的后台工作线程,该函数的参数为func somefunction(data ...interface{})
,以便在整个应用程序中实现通用性和可重用性。
在其中一个函数中,参数的数量较多,在函数定义中,我将数组项逐个转换为:
someVar := data[0].(string)
当我通常处理1-2个参数时,这种方法是可以接受的。但是当参数的数量增加时,这种方法变得繁琐。
所以,有没有一种更简洁的方法按照它们出现的顺序将元素解析为结构体?
我的目标是以一种更简洁的方式完成这个操作,而不是逐个从数组中获取一个并将其转换为字符串变量。
示例代码解释了这个场景:https://go.dev/play/p/OScAjyyLW0W
英文:
I have a scenario where I'm calling a function leveraging a common background worker thread that has arguments as func somefunction(data ...interface{})
to be generic and reusable across the application.
In one of the functions, the number of arguments are more and in the unction definition, I am casting the array items individually like
someVar := data[0].(string)
Now this approach is fine when I'm usually dealing with 1-2 arguments. But it becomes tedious when the number of arguments increases.
So is there a cleaner way to parse the elements into a struct in the order of their appearance?
My objective is to do this in a cleaner way rather than individually getting one from array and casting to a string variable.
Sample code explaining the scenario https://go.dev/play/p/OScAjyyLW0W
答案1
得分: 3
使用reflect包从interface{}的切片中设置值的字段。这些字段必须是导出的。
// setFields将dest指向的结构体中的字段设置为args。这些字段必须是导出的。
func setFields(dest interface{}, args ...interface{}) {
v := reflect.ValueOf(dest).Elem()
for i, arg := range args {
v.Field(i).Set(reflect.ValueOf(arg))
}
}
像这样调用它:
type PersonInfo struct {
ID string // <-- 注意导出的字段名。
Name string
Location string
}
var pi PersonInfo
setFields(&pi, "A001", "John Doe", "Tomorrowland")
英文:
Use the reflect package to set fields on a value from a slice of interface{}. The fields must be exported.
// setFields set the fields in the struct pointed to by dest
// to args. The fields must be exported.
func setFields(dest interface{}, args ...interface{}) {
v := reflect.ValueOf(dest).Elem()
for i, arg := range args {
v.Field(i).Set(reflect.ValueOf(arg))
}
}
Call it like this:
type PersonInfo struct {
ID string // <-- note exported field names.
Name string
Location string
}
var pi PersonInfo
setFields(&pi, "A001", "John Doe", "Tomorrowland")
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论