首頁  >  文章  >  後端開發  >  Golang 將如何解決你的第一個工作任務

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

WBOY
WBOY原創
2024-07-17 21:50:35526瀏覽

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://<use your id after sign up>.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 <- err
        return
    }
    usersChan <- user
}()

select {
case users := <-usersChan:
    fmt.Printf("Fetched users: %+v\n", users)
case err := <-errChan:
    fmt.Printf("Error fetching users: %v\n", err)
case <-ctx.Done():
    fmt.Println("Request timed out")
}

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

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

附註

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

以上是Golang 將如何解決你的第一個工作任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn