PHP小编草莓今天为大家介绍一种常用的技巧——Go。这是一种将一个结构映射到另一个结构的惯用方式。在编程中,我们经常需要将一个数据结构转换为另一个数据结构,以满足不同的需求。Go提供了
PHP小编草莓今天为大家介绍一种常用的技巧——Go。这是一种将一个结构映射到另一个结构的惯用方式。在编程中,我们经常需要将一个数据结构转换为另一个数据结构,以满足不同的需求。Go提供了一种简洁而灵活的方法来实现这个目标。无论是在处理数据库查询结果、api响应还是其他数据转换场景中,Go都能帮助我们轻松完成结构映射的工作。接下来,让我们一起来了解一下Go的具体用法吧!
我正在使用第三方 go 语言库来查询用户的 ldap 数据库。该库返回 resultuser 的 searchresult 切片,我需要将其映射到我自己的 user 结构。这两个结构具有不同的字段名称,我只需要 resultuser 中的特定字段。 go 中是否有更惯用的方法将一个结构转换为另一个结构。
我在下面创建了一个演示(go playground 上也有链接)。预先感谢您给这位 go 新手的任何建议!
package main
import "fmt"
type (
User struct {
id int32
firstName string
}
ResultUser struct {
uid int32
fname string
}
SearchResults []ResultUser
)
func main() {
results := getSearchResults()
users := mapResultsToUsers(results) // <-- This is the problem
fmt.Println("User struct:", users[0].id, users[0].firstName)
fmt.Println("User struct:", users[1].id, users[1].firstName)
}
// Simulates a query to a data with a library
func getSearchResults() (results SearchResults) {
return append(results, ResultUser{1, "John"}, ResultUser{2, "Jane"})
}
// Seems like a code smell to have to do this
// Is there a more idiomatic way to do this?
func mapResultsToUsers(results SearchResults) (users []User) {
for _, result := range results {
users = append(users, User{result.uid, result.fname})
}
return users
}
我见过结构体字段标签,但不确定是否有更好的方法。
我认为您所拥有的几乎是最好的解决方案,尽管我会将映射移至专用函数中,例如:
func fromresultuser(r *resultuser) *user {
return &user{
id: r.uid,
firstname: r.fname,
}
}
然后 mapresultstousers
变为:
func mapresultstousers(results searchresults) (users []*user) {
for _, result := range results {
users = append(users, fromresultuser(result))
}
return users
}
我见过结构体字段标签,但不确定是否有更好的方法。
您可以组合一些内容,以便可以注释您的 user
结构,如下所示:
User struct {
id int32 `mappedFrom:"uid"`
firstName string `mappedFrom:"fname"`
}
但是实现该方法所需的方法比此处介绍的 fromresultuser
复杂得多,并且需要熟悉 reflect
包。我认为,正如我的一位同事喜欢说的那样,“果汁不值得榨”。
以上就是Go - 将一个结构映射到另一个结构的惯用方式的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: Go - 将一个结构映射到另一个结构的惯用方式
本文链接: https://www.lsjlt.com/news/563587.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0