首頁  >  文章  >  後端開發  >  Go - 將一個結構映射到另一個結構的慣用方式

Go - 將一個結構映射到另一個結構的慣用方式

WBOY
WBOY轉載
2024-02-11 20:03:081059瀏覽

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 - 將一個結構映射到另一個結構的慣用方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除