首頁 > 後端開發 > Golang > 從零到合併:在 Go 中建立 JSON 重命名欄位元件

從零到合併:在 Go 中建立 JSON 重命名欄位元件

Barbara Streisand
發布: 2024-11-13 15:43:02
原創
559 人瀏覽過

From Zero to Merge: Building a JSON Renaming Field Component in Go

Instill-ai 簡介

從事 Instill 的管道後端專案就像在解決拼圖一樣?拼圖-除了一些拼圖不斷改變名稱!我的使命?建立一個可以重新命名 JSON 欄位而不產生衝突的元件。跟我一起分享我學習 Go、研究 Instill 組織良好的文件以及創建一個現已合併並準備就緒的解決方案的旅程! ?


挑戰

Instill 需要一種動態重命名 JSON 資料結構中欄位的方法。轉折?我們必須處理重新命名的欄位可能與現有欄位發生衝突的情況。如果沒有衝突解決系統,混亂就會佔上風!

From Zero to Merge: Building a JSON Renaming Field Component in Go 灌輸人工智慧 / 管道後端

⇋ 用於 Instill VDP API 服務的 REST/gRPC 伺服器

管道後端

From Zero to Merge: Building a JSON Renaming Field Component in Go

pipeline-backend 管理 Versatile Data 中的所有管道資源 管道 (VDP),用於簡化來自 開始組件,經過AI/數據/應用組件,直至結束 組件。

概念

管道

?灌輸 VDP,管道是一個 DAG(有向無環圖),由 多個組件

flowchart LR
s[Trigger] --> c1[OpenAI Component]
c1 --> c2[Stability AI Component]
c1 --> c3[MySQL Component]
c1 --> e[Response]
c2 --> e
登入後複製
登入後複製
登入後複製
載入中

組件

組件充當管道中的重要構建塊。

更多請參閱組件包文檔 詳情。

食譜

管道配方指定組件的配置方式及其使用方式 相互關聯。

食譜是用 YAML 語言定義的:

flowchart LR
s[Trigger] --> c1[OpenAI Component]
c1 --> c2[Stability AI Component]
c1 --> c3[MySQL Component]
c1 --> e[Response]
c2 --> e
登入後複製
登入後複製
登入後複製
進入全螢幕模式 退出全螢幕模式
在 GitHub 上查看

說實話,我開始懷疑自己能否解決這個問題,但後來 Anni 留下了讓我繼續前進的完美訊息。

From Zero to Merge: Building a JSON Renaming Field Component in Go

一旦我適應了,為這項任務精心設計了 JSON 模式的 ChunHao 就給我開了綠燈?開始編碼。就這樣,旅程開始了!


步驟 2️⃣ 步:設計解決方案

關鍵要求是:

  1. 動態重新命名:應在不影響 JSON 結構的情況下重新命名欄位。
  2. 衝突偵測:我們需要發現原始欄位和重新命名欄位之間的任何衝突。
  3. 衝突解決:平穩的解決方案(例如附加後綴)可以防止名稱衝突。

From Zero to Merge: Building a JSON Renaming Field Component in Go


步驟 3️⃣:建置組件

帶著咖啡☕和勇氣? ,我開始編碼。核心邏輯先睹為快:

映射字段

首先,我建立了一個映射系統來追蹤新舊欄位名稱。這是檢測衝突的關鍵。

flowchart LR
s[Trigger] --> c1[OpenAI Component]
c1 --> c2[Stability AI Component]
c1 --> c3[MySQL Component]
c1 --> e[Response]
c2 --> e
登入後複製
登入後複製
登入後複製

每當偵測到衝突時,該函數都會將「_conflict」新增到新名稱中。這是一個簡單的技巧,可以確保我們的 JSON 欄位保持唯一,最重要的是,彼此友好! ✌️

重新命名欄位

欄位映射到位後,下一步是將它們套用到我們的 JSON 資料。

variable
  <span># pipeline input fields</span>
output:
  <span># pipeline output fields</span>
component:
  <component-id>:
    type: <component-definition-id>
    task: <task-id>
    input:
      <span># values for the input fields</span>
    condition: <condition> <span># conditional statement to execute or bypass the</span>
登入後複製

以下是將映射名稱套用至 JSON 資料的邏輯。結果呢?我們的數據被整齊地重命名,衝突得到解決,結構完好無損。 ?

建立組件後,刪除了草稿 PR 並得到了評論:

From Zero to Merge: Building a JSON Renaming Field Component in Go


步驟 4️⃣:測試和完善

在熟悉了 Instill 的測試方法並學習如何創建有效的測試案例後,我繼續進行下一步。

From Zero to Merge: Building a JSON Renaming Field Component in Go

測試時間! ?我編寫的測試涵蓋了從簡單的重命名到具有巢狀 JSON 欄位的複雜邊緣情況的所有內容。每一輪測試都會帶來進一步的改進。

func mapFields(fields map[string]string) map[string]string {
    newFieldMap := make(map[string]string)
    for oldName, newName := range fields {
        // Check for conflict
        if _, exists := newFieldMap[newName]; exists {
            newName += "_conflict" // Add suffix for conflicts
        }
        newFieldMap[oldName] = newName
    }
    return newFieldMap
}
登入後複製

在這裡我想分享個人反思:測驗是這個專案中最難的部分? ‍? 。有時我會想,「這個測驗是否達到了預期的效果?」

就在那時,我遇到了lint問題

From Zero to Merge: Building a JSON Renaming Field Component in Go

他指出了問題,甚至提供了解決方案。我所要做的就是實現它,但這提醒我,即使是最小的細節也能讓程式碼順利運行。

一旦我克服了最初的障礙,測試就成了我的安全網。它讓我有信心知道我的程式碼可以在不同的場景下運作? ️‍♂️。它還向我表明,測試不僅僅是一個檢查步驟,它是確保我的程式碼可靠且有彈性的一種方法。


步驟5️⃣步:CI檢查和最終調整

完成測試後,我推送了程式碼,準備進行審核過程。然而,我們的 CI(持續整合)檢查沒有通過。 Anni 的評論溫柔地提醒我仔細檢查我的測試案例:

「嘿@AkashJana18,你能檢查一下你的測試案例嗎?我們的CI 檢查顯示這裡還沒有通過。請先在本地進行測試,然後再推送到PR。每當您推送提交時,我們都會觸發檢查,以便您可以在我們的工程師審查您的程式碼之前發現任何問題。

From Zero to Merge: Building a JSON Renaming Field Component in Go那時我意識到我必須在提交之前在本地運行測試。春浩也補充:

「請在請求審核之前執行並通過。執行 $ go test ./pkg/component/operator/json/v0/... 在本機檢查。」

我快速在本地運行測試,發現問題並修復它們。

From Zero to Merge: Building a JSON Renaming Field Component in Go

From Zero to Merge: Building a JSON Renaming Field Component in Go慶祝一下?
這個過程讓我更加體會到本地測試的重要性,因為它確保了在提交審核之前一切都是可靠的。

合併之前,ChunHao 進行了最終審查,進行了一些調整,對測試配方進行了 QA 並更新了文件以反映新的更改。非常感謝安妮在整個過程中持續提供的支持——這帶來了巨大的改變。 ?


?對協作過程的反思??‍??

我學到的最大的教訓之一是協作和指導如何能夠成就或毀掉一個專案。 Instill 的版主 Anni 和 ChunHao 在我迷失於 Go 文法或苦苦尋找正確方法時為我提供了所需的指導。我們共同努力,將一個複雜的問題變成了一個乾淨、實用的解決方案。

說實話,有些時候我覺得自己已經咬得太多了。但Anni不斷的鼓勵,加上春浩的明確指示,讓我一直走在正軌上。


⏭️ 後續步驟和未來的改進

另一個步驟可能是將這種方法擴展到需要動態欄位名稱處理的管道的其他部分 - 因為誰不喜歡一點自動化⚙️?


?️ 工具和資源?

  1. Go 文件:用於深入了解 Go 語法並理解核心概念。
  2. Instill 文件:一個組織良好的資源金礦,可幫助您了解 Instill 管道。
  3. Go 測試框架:Go 中內建的測試包,用於編寫單元測試,確保一切按預期工作,並與 CI 工具整合。
  4. Golangci-lint:Go linters 聚合器,用於在開發和 CI 檢查期間識別問題並加強程式碼品質。

??‍??️ 我的學習

憑藉 Instill 堅如磐石的文檔、ChunHao 的指導以及 Anni 的道德支持,這個計畫成為了一次奇妙的學習體驗。我從對 Go 一無所知到實現了一個準備用於生產的全功能特性(並且我有合併的 PR 來證明這一點?)。

證明:

From Zero to Merge: Building a JSON Renaming Field Component in Go

以上是從零到合併:在 Go 中建立 JSON 重命名欄位元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板