卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35412本站已运行395

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 包。我认为,正如我的一位同事喜欢说的那样,“果汁不值得榨”。

卓越飞翔博客
上一篇: 如何使用 Python 将渲染的 HTML 模板插入 Google 文档
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏