Go
Esta página está traducida del inglés. Si ambas difieren, la página en inglés es la correcta. Leer la página en inglés
La biblioteca de Go es el paquete lingara del módulo github.com/Spinning-Cat-Studios/lingara_api_clients/go. Necesita Go 1.23 o posterior y usa únicamente la biblioteca estándar.
Cómo se usa
- Cada llamada recibe primero un
context.Context. Cancela el contexto para cancelar la llamada; el error que recibes es el del propio contexto, así queerrors.Is(err, context.Canceled)funciona. - Las llamadas son síncronas. Ejecútalas en goroutines cuando quieras varias a la vez; un mismo cliente se puede compartir con seguridad.
- Un flujo se lee con
for ev, err := range s.Events(), y cada evento se distingue con un type switch. Ciérralo condefer s.Close(). - Los errores son cuatro tipos que comparten la interfaz
lingara.Error. Usaerrors.Aspara llegar a uno de ellos;RetryAfteresnilcuando la API no indicó ninguna espera. - Las opciones son funcionales: pasa
lingara.WithHTTPClientpara usar tu propiohttp.Client. SuTimeoutlimita entonces cada llamada, flujos incluidos.
Los ejemplos de abajo instalan el módulo, crean un cliente, reciben en flujo una lista de vocabulario y gestionan un error.
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)
}