Lingara Lingara 文档 学习指南 API 库 应用 构建 网页版
语言: 中文简体

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)
}

本页封装的内容