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 - 将一个结构映射到另一个结构的惯用方式的详细内容。更多信息请关注PHP中文网其他相关文章!