」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Golang 將如何解決你的第一個工作任務

Golang 將如何解決你的第一個工作任務

發佈於2024-07-31
瀏覽:395

Golang,或簡稱 Go,已稱為 Go gopher 語言。如果你仍然不明白為什麼是地鼠,你可以在這篇文章中找到令人驚訝的吉祥物歷史。好吧,讓我們從頭開始吧,Golang 已成為眾所周知的最高效的程式語言之一。 與 Java 或 Python 等傳統語言不同,Go 在易於編寫的程式碼和快速執行之間取得了獨特的平衡,從而加快了開發速度並減少了偵錯和測試時間。本文將介紹在與緩慢且不穩定的 REST API 微服務互動的專案中使用 goroutine 和上下文的真實範例。

任務
假設您剛加入團隊,您的團隊負責人要求您將用 Golang 編寫的新微服務(例如風險管理器)綁定到透過 REST API 公開的使用者微服務。

問題
風險管理者需要與可能緩慢且不穩定的 REST API 進行交互,這要求我們謹慎處理此類請求。我將使用 goroutine 進行非同步 HTTP 請求,並使用上下文來管理請求逾時和錯誤處理。

解決方案

在 Golang 中使用 goroutine 和上下文可以有效管理並發任務並處理緩慢或不穩定的外部 API。

用程式碼解釋它的第一步是創建API,我使用了共享軟體服務https://mockapi.io/生成REST很方便具有一組基本實體的API,例如users.

Image description

假設有人盡力而為,而您的公司有一項列出用戶的內部服務。我們的任務是在新的風險管理器中重複使用使用者清單(使用者資料結構滿足mockapi.io所描述的契約)。下面的程式碼發出請求,處理正文,並產生使用者清單或對應的錯誤。

type User struct {
    CreatedAt string
    Name      string
    Avatar    string
    Id        string
}

// Original slow request
func fetchUsers(ctx context.Context) (*[]User, error) {
    resp, err := http.Get("https://.mockapi.io/api/v1/users")
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("failed to fetch users: %s", resp.Status)
    }

    var users []User
    if err := json.NewDecoder(resp.Body).Decode(&users); err != nil {
        return nil, err
    }

    return &users, nil
}

為了控制操作,我將為所有其他上下文使用最頂層的父上下文 - context.Background。我將用新資料補充此上下文,在本例中是超時 - context.WithTimeout,我將其定義為 2 秒。您可以在本文中閱讀有關在 Go 中使用上下文的更多資訊。

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

usersChan := make(chan *[]User)
errChan := make(chan error)

go func() {
    users, err := fetchUsers(ctx)
    if err != nil {
        errChan 



在範例中,我使用兩個通道 - usersChan 記錄從內部服務收到的結果,第二個通道 errChan - 記錄錯誤。
如果來自慢速 API 的回應沒有在 2 秒內到達,我們會偵測到錯誤並提供在外部層正確處理它的機會。

在風險管理器的這個實際範例中,goroutines 啟用了非同步 HTTP 請求,而上下文確保了超時處理,這對於建立可靠且有彈性的微服務至關重要。

附註

本文面向具有基礎知識但不知道可以在哪裡應用知識的初學者開發人員。我很高興收到您的回饋,並很樂意回答您的問題。
Go 語言中最基本的東西的工作範例和其他幾個實作可以在我的 GitHub 上找到,連結為

版本聲明 本文轉載於:https://dev.to/maxflower/how-golang-will-solve-your-first-working-task-3kpc?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用「filter_var()」在 PHP 中驗證 URL 以及何時應考慮正規表示式?
    如何使用「filter_var()」在 PHP 中驗證 URL 以及何時應考慮正規表示式?
    URL 的PHP 驗證/正規表示式如果您需要一個簡單的方法來驗證PHP 中的URL,您可以使用filter_var() 函數。這個多功能函數可以確定給定的字串是否符合有效的URL: ]預設情況下,filter_var() 採用基本的URL 過濾機制,可能不適合更複雜的驗證要求。如果您發現自己處於這種...
    程式設計 發佈於2024-12-21
  • C++ 物件實例化:堆疊與堆疊:「new」還是不是「new」?
    C++ 物件實例化:堆疊與堆疊:「new」還是不是「new」?
    實例化物件:有或沒有New在C中建立物件時,程式設計師可以使用「new」運算子或直接實例化它們沒有它。雖然這兩種方法都創建對象,但它們在幾個關鍵方面有所不同。 不帶 New實例化一個不帶「new」的物件會直接在目前作用域中為其保留記憶體。這通常在堆疊上完成,並產生具有自動生命週期的物件。物件在其定義...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中停用魔術引號並處理反斜線插入問題?
    如何在 PHP 中停用魔術引號並處理反斜線插入問題?
    「每個引號前都有斜線」Enigma您在PHP 腳本中遇到了一個特殊問題:每當表單提交給自身時對於包含雙引號的值,它會在每個值之前加上一個反斜線。此行為歸因於 PHP 臭名昭著的「魔術引號」功能。 魔術引號會自動轉義某些字元(包括雙引號),以防止惡意注入。雖然這看起來像是一種安全措施,但它也可能導致與...
    程式設計 發佈於2024-12-21
  • 如何在 C++ 中以字元數組形式存取原始向量資料?
    如何在 C++ 中以字元數組形式存取原始向量資料?
    以 Char 陣列形式存取原始向量資料考慮需要在函數中使用 std::vector 作為 char 陣列需要一個空指標。最初,使用常規字元數組很簡單。然而,切換到 std::vector 的靈活性在存取其原始資料方面提出了挑戰。 將向量指標傳遞給函數立即嘗試將向量&something 或其迭代器&s...
    程式設計 發佈於2024-12-21
  • MySQL設定檔中的「init_connect」和「init-connect」有什麼差別?
    MySQL設定檔中的「init_connect」和「init-connect」有什麼差別?
    了解MySQL 設定檔部分MySQL 設定檔(my.ini) 提供多個部分,每個部分針對MySQL 操作的特定方面進行客製化。讓我們深入研究這些部分並闡明「init_connect」和「init-connect」之間的差異:my.ini 文件的可選部分: [mysql]:設定mysql命令列客戶端,...
    程式設計 發佈於2024-12-21
  • 為什麼在 C++ 向量中使用迭代器時我的距離計算會關閉?
    為什麼在 C++ 向量中使用迭代器時我的距離計算會關閉?
    在C 向量中使用迭代器:已解決的常見陷阱迭代器對於遍歷和操作C 向量中的元素至關重要。然而,如果使用不當,它們可能會導致意想不到的結果。在本文中,我們將探討向量運算中迭代器的常見問題,並提供解決方案來解決這個問題。 在提供的程式碼片段中,嘗試計算儲存在向量中的點之間的距離。由於迭代器的使用不正確,預...
    程式設計 發佈於2024-12-21
  • IllegalArgumentException 或 NullPointerException:Setter 方法中空參數的哪一個例外?
    IllegalArgumentException 或 NullPointerException:Setter 方法中空參數的哪一個例外?
    何時為空參數拋出IllegalArgumentException 或NullPointerException定義setter 方法時,開發人員經常面臨是否拋出IllegalArgumentException 的困境或定義setter 方法時,開發人員經常面臨是否拋出IllegalArgumentEx...
    程式設計 發佈於2024-12-21
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-12-21
  • 如何從 Python 3 的 `map()` 迭代器取得列表?
    如何從 Python 3 的 `map()` 迭代器取得列表?
    在Python 3.x 中檢索映射列表:map() 作為迭代器在Python 3.x 中,map()函數傳回一個迭代器而不是列表。實施此更改是為了提高記憶體效率並優化效能。但是,如果您需要將映射值作為清單檢索以進行進一步處理,則會帶來挑戰。 解決方案:將迭代器轉換為列表要檢索映射值作為列表,使用li...
    程式設計 發佈於2024-12-21
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2024-12-21
  • 為什麼我的子選擇器無法設定表格儲存格的樣式?
    為什麼我的子選擇器無法設定表格儲存格的樣式?
    表結構中的子選擇器與後代選擇器在HTML 文件中選擇元素時,開發者經常使用子選擇器(>) 來定位指示子層級和後代選擇器以任何巢狀元素為目標。但是,在某些情況下,子選擇器似乎會意外失敗。 考慮以下範例:table tr td { background-color: red; } table >...
    程式設計 發佈於2024-12-21
  • 想學習 Node.js?對於初學者來說最好的資源是什麼?
    想學習 Node.js?對於初學者來說最好的資源是什麼?
    踏上Node.js 之旅:初學者綜合指南 踏上Node.js 之旅:初學者綜合指南Node.js 已成為世界上一股強大的力量Web 開發,但開始使用這個尖端平台可能會令人畏懼。本文旨在透過提供全面的指南來幫助您踏上 Node.js 之旅來應對這項挑戰。 官方資源與替代選項雖然官方資源Node.js...
    程式設計 發佈於2024-12-21
  • 為什麼 GCC 無法在非命名空間範圍內編譯顯式專業化?
    為什麼 GCC 無法在非命名空間範圍內編譯顯式專業化?
    非命名空間範圍中的顯式專業化儘管在Clang 中編譯成功,但給定的程式碼無法在GCC 中編譯。根據 C 標準 ([temp.expl.spec]),可以在可以定義對應主模板的任何作用域中聲音明​​顯式特化。 此行為似乎是 GCC 中的一個錯誤。根據 CWG 727,[temp.expl.spec] ...
    程式設計 發佈於2024-12-21
  • !和 ?在打字稿中。
    !和 ?在打字稿中。
    有沒有想過那些神秘的符號是什麼!和 ?在 TypeScript 中做些什麼? ?它們可能很小,但威力很大! 以下是使用它們的方式和原因。 ? - 可選修飾符 使用?將屬性或參數標記為可選。它告訴 TypeScript,「嘿,這個欄位可能未定義。」 interface User { ...
    程式設計 發佈於2024-12-21
  • 什麼是多態性?探索 Java 中的型別-物件關係
    什麼是多態性?探索 Java 中的型別-物件關係
    在學習Java的時候,遇到了多態的概念。我傾向於在深入實際使用之前掌握基本原理,因此我在這裡記錄了我的解釋。 我見過的多態性的常見解釋 多態的本義是「多元」。然而,在本文的上下文中,它指的是變數能夠保存不同類型的對象,只要透過類別繼承或介面實現存在關係,而不會導致錯誤。 ...
    程式設計 發佈於2024-12-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3