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()خوانده میشود و هر رویداد با یک 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.6Go
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)
}