php小編百草今天為大家介紹一個強大的Golang特性-具有不同結構標籤集的Unmarshal。在Golang程式設計中,Unmarshal是一種將資料轉換為結構體的過程。但是,當我們的資料來源包含不同的結構標籤集時,傳統的Unmarshal方法可能無法滿足需求。因此,我們需要使用具有不同結構標籤集的Golang Unmarshal來實現這項功能。本文將詳細介紹這個特性的使用方法和注意事項。讓我們一起來探索吧!
問題內容
我正在使用第三方工具的 api,它的 json 中包含自訂鍵名稱。我還必須在兩個不同的環境(生產環境和登台環境)上使用 api。不幸的是,api 中的自訂欄位在兩個環境中具有不同的鍵名稱來表示相同的資料。在下面的範例中,生產環境中的 json 金鑰 custom-1
與暫存環境中的 json 金鑰 custom-7
完全相同。我想將其中任何一個解組到相同的資料結構中,但我不知道如何進行。我希望有一種方法可以以某種方式覆寫json.unmarshal()
函數用於在prod 上使用json
的標籤,但在暫存時使用jsonstaging
。對我來說,這是最有意義且最簡單的解決方案。我猜我必須為我的jsonobj
類型編寫一個自定義unmarshaljson(data []byte) error
函數,但同樣,我不知道如何在自定義函數中實現所需的行為。有人能給我指出正確的方向、一些文件或一些我可以使用的範例嗎?
package main import ( "encoding/json" "fmt" ) type jsonobj struct { id string `json:"custom-1" jsonstaging:"custom-7"` desc string `json:"custom-2" jsonstaging:"custom-8"` } func (i jsonobj) string() string { return fmt.sprintf(`{ id: "%s", desc: "%s" }`, i.id, i.desc) } func main() { var jsonprod = `{ "custom-1": "object-a", "custom-2": "test" } ` var jsonstaging = `{ "custom-7": "object-a", "custom-8": "test" } ` var jsonobjprod jsonobj var jsonobjstaging jsonobj json.unmarshal([]byte(jsonprod), &jsonobjprod) json.unmarshal([]byte(jsonstaging), &jsonobjstaging) fmt.println("production: ", jsonobjprod) fmt.println("staging: ", jsonobjstaging) }
當我用 go run 運行它時,我得到
production: { id: "object-a", desc: "test" } staging: { id: "", desc: "" }
這是我目前程式碼所期望的,但我想得到
Production: { Id: "object-a", Desc: "test" } Staging: { Id: "object-a", Desc: "test" }
我無法修改臨時環境或生產環境的 api。
我嘗試過創建不同的結構和接口,但是隨著字段數量(以及自定義 json 鍵)的增加(它們會增加),這似乎是維護的噩夢。如果這是唯一的方法,請幫助我,在我決定這可能不是正確的路徑之前,我也沒有讓它發揮作用。
解決方法
為了將來參考,如果有人想這樣做,我想我找到了使用內建 reflect
套件的方法。
首先,您必須使用 json.unmarshal() 函數,但填入 map[string] 介面{}
而不是您要建立的物件。
然後我寫了一個獲取環境和地圖的函數。它會遍歷實際物件(而不是地圖)的新實例中的所有字段,並取得您正在使用的環境的標籤。然後它將新物件中的欄位設為 objmap[tag].(<variable_type>)</variable_type>
。使用標籤設定所有欄位後,它將傳回新物件。
這是我的工作程式碼:
package main import ( "encoding/json" "fmt" "reflect" ) const ( StagingStructTag = "jsonStaging" ProductionStructTag = "json" ) type jsonObj struct { Id string `json:"custom-1" jsonStaging:"custom-7"` Desc string `json:"custom-2" jsonStaging:"custom-8"` } func (i jsonObj) String() string { return fmt.Sprintf(`{ Id: "%s", Desc: "%s" }`, i.Id, i.Desc) } func main() { var jsonProd = `{ "custom-1": "object-a", "custom-2": "test" } ` var jsonStaging = `{ "custom-7": "object-a", "custom-8": "test" } ` var env string = "staging" var jsonObjProd jsonObj var jsonObjStaging jsonObj var jsonObjProdMap map[string]interface{} var jsonObjStagingMap map[string]interface{} json.Unmarshal([]byte(jsonStaging), &jsonObjStagingMap) json.Unmarshal([]byte(jsonProd), &jsonObjProdMap) jsonObjStaging = BuildJsonObj(env, jsonObjStagingMap) env = "production" jsonObjProd = BuildJsonObj(env, jsonObjProdMap) fmt.Println("Production: ", jsonObjProd) fmt.Println("Staging: ", jsonObjStaging) } func BuildJsonObj(env string, objMap map[string]interface{}) jsonObj { var obj jsonObj var t reflect.Type = reflect.TypeOf(obj) var structTagName string if env == "staging" { structTagName = StagingStructTag } else if env == "production" { structTagName = ProductionStructTag } for i := 0; i < t.NumField(); i++ { var field reflect.StructField = t.Field(i) var tag string var ok bool if tag, ok = field.Tag.Lookup(structTagName); ok { switch field.Name { case "Id": obj.Id = objMap[tag].(string) case "Desc": obj.Desc = objMap[tag].(string) } } } return obj }
以上是具有不同結構標籤集的 Golang Unmarshal的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang在实际应用中表现出色,以简洁、高效和并发性著称。1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...

golang ...

Go語言中如何對比並處理三個結構體在Go語言編程中,有時需要對比兩個結構體的差異,並將這些差異應用到第�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver Mac版
視覺化網頁開發工具