Lingara Lingara 說明文件 學習指南 API 程式庫 App 建立 網頁版
語言: 粵語

Go

呢頁係由英文翻譯過嚟嘅。如果兩個版本有出入,以英文頁為準。 睇英文頁

Go 函式庫係 lingara 套件,喺模組 github.com/Spinning-Cat-Studios/lingara_api_clients/go 入面。佢要 Go 1.23 或者更新嘅版本,而且只用標準函式庫。

用起嚟點樣

  • 每個呼叫嘅第一個參數都係 context.Context。取消個 context 就可以取消個呼叫;你收返嘅錯誤就係 context 自己嘅錯誤,所以 errors.Is(err, context.Canceled) 用得。
  • 呼叫係同步嘅。想同時發幾個呼叫,就喺 goroutine 入面行;一個用戶端可以安全咁共用。
  • 串流用 for ev, err := range s.Events() 嚟讀,每個事件用 type switch 配對。用 defer s.Close() 閂咗佢。
  • 錯誤分四種型別,佢哋共用 lingara.Error 介面。用 errors.As 攞到其中一種;如果 API 冇講要等幾耐,RetryAfter 就係 nil。
  • 選項係函式式寫法:傳 lingara.WithHTTPClient 就可以用你自己嘅 http.Client。咁佢嘅 Timeout 就會限制每一個呼叫,串流都計埋。

下面嘅範例會安裝模組、建立用戶端、用串流攞一份詞彙清單,同埋處理錯誤。

Go

go get github.com/Spinning-Cat-Studios/lingara_api_clients/go@v0.1.0-alpha.6

Go

import (
	"os"

	lingara "github.com/Spinning-Cat-Studios/lingara_api_clients/go"
)

client, err := lingara.New(
	lingara.WithClientCredentials(os.Getenv("LINGARA_CLIENT_ID"), os.Getenv("LINGARA_CLIENT_SECRET")),
)
if err != nil {
	return nil, err
}

Go

count := uint8(8)
s, err := client.GenerateVocabulary(ctx, lingara.VocabRequest{Level: 2, SourceLang: "en", TargetLang: "zh", Count: &count})
if err != nil {
	return err
}
defer s.Close()
for ev, err := range s.Events() {
	if err != nil {
		return err
	}
	if item, ok := ev.(lingara.GenerateVocabularyEventItem); ok {
		fmt.Println(item.Data.Word, item.Data.Translation)
	}
}

Go

_, err := client.GetUsage(ctx)
var apiErr *lingara.APIError
var oauthErr *lingara.OAuthError
var maintenance *lingara.MaintenanceError
var transport *lingara.TransportError
switch {
case err == nil:
case errors.As(err, &apiErr):
	// A refusal from the API: Status, Code (stable) and Message (localised).
	fmt.Println(apiErr.Status, apiErr.Code, apiErr.Message)
	if apiErr.RetryAfter != nil {
		fmt.Println("retry after", *apiErr.RetryAfter)
	}
case errors.As(err, &oauthErr):
	// The token endpoint refused the credentials or the scopes.
	fmt.Println(oauthErr.Status, oauthErr.ErrorCode, oauthErr.Description)
case errors.As(err, &maintenance):
	fmt.Println("under maintenance")
	if maintenance.RetryAfter != nil {
		fmt.Println("retry after", *maintenance.RetryAfter)
	}
case errors.As(err, &transport):
	// No usable answer: connect, tls, reset, timeout, and so on.
	fmt.Println("transport:", transport.Kind)
default:
	// ctx was cancelled or timed out: errors.Is(err, context.Canceled).
	fmt.Println(err)
}

呢頁包裝咗乜嘢