Go 语言以高并发、低延迟著称, 与 Claude API 结合能构建高性能的 AI 服务。 本文覆盖官方 Go SDK 的完整使用方法。
安装
bash
go get github.com/anthropics/anthropic-sdk-go基础调用
go
package main
import (
"context"
"fmt"
"os"
anthropic "github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient(
anthropic.WithAPIKey(os.Getenv("ANTHROPIC_API_KEY")),
)
msg, err := client.Messages.New(context.Background(),
anthropic.MessageNewParams{
Model: anthropic.F(anthropic.ModelClaudeSonnet4_5),
MaxTokens: anthropic.F(int64(1024)),
Messages: anthropic.F([]anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.NewTextBlock("帮我用 Go 写一个并发安全的缓存"),
),
}),
},
)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v
", err)
os.Exit(1)
}
fmt.Println(msg.Content[0].Text)
}流式输出(Streaming)
go
stream := client.Messages.NewStreaming(context.Background(),
anthropic.MessageNewParams{
Model: anthropic.F(anthropic.ModelClaudeSonnet4_5),
MaxTokens: anthropic.F(int64(2048)),
Messages: anthropic.F([]anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.NewTextBlock("写一篇关于 Go 并发的技术博客"),
),
}),
},
)
// 迭代流式事件
for stream.Next() {
event := stream.Current()
switch delta := event.Delta.(type) {
case anthropic.ContentBlockDeltaEventDelta:
if delta.Type == anthropic.ContentBlockDeltaEventDeltaTypeTextDelta {
fmt.Print(delta.Text)
}
}
}
if err := stream.Err(); err != nil {
fmt.Fprintf(os.Stderr, "Stream error: %v
", err)
}多轮对话
go
type ChatSession struct {
client *anthropic.Client
messages []anthropic.MessageParam
model anthropic.Model
}
func NewChatSession(apiKey string) *ChatSession {
return &ChatSession{
client: anthropic.NewClient(anthropic.WithAPIKey(apiKey)),
model: anthropic.ModelClaudeSonnet4_5,
}
}
func (s *ChatSession) Chat(ctx context.Context, userMsg string) (string, error) {
s.messages = append(s.messages, anthropic.NewUserMessage(
anthropic.NewTextBlock(userMsg),
))
resp, err := s.client.Messages.New(ctx, anthropic.MessageNewParams{
Model: anthropic.F(s.model),
MaxTokens: anthropic.F(int64(2048)),
Messages: anthropic.F(s.messages),
})
if err != nil {
return "", err
}
assistantMsg := resp.Content[0].Text
// 保存助手回复到对话历史
s.messages = append(s.messages, anthropic.NewAssistantMessage(
anthropic.NewTextBlock(assistantMsg),
))
return assistantMsg, nil
}System Prompt
go
msg, err := client.Messages.New(ctx, anthropic.MessageNewParams{
Model: anthropic.F(anthropic.ModelClaudeSonnet4_5),
MaxTokens: anthropic.F(int64(1024)),
System: anthropic.F([]anthropic.TextBlockParam{
{Type: anthropic.F(anthropic.TextBlockParamTypeText),
Text: anthropic.F("你是一位 Go 语言专家,回复简洁准确。")},
}),
Messages: anthropic.F([]anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("channel 和 goroutine 的最佳实践?")),
}),
})并发调用(高性能场景)
go
func batchProcess(ctx context.Context, client *anthropic.Client, prompts []string) []string {
type result struct {
idx int
text string
err error
}
results := make([]result, len(prompts))
ch := make(chan result, len(prompts))
// 控制并发数,避免超过 Rate Limit
sem := make(chan struct{}, 5)
for i, prompt := range prompts {
go func(idx int, p string) {
sem <- struct{}{} // 获取信号量
defer func() { <-sem }() // 释放信号量
msg, err := client.Messages.New(ctx, anthropic.MessageNewParams{
Model: anthropic.F(anthropic.ModelClaudeHaiku4_5),
MaxTokens: anthropic.F(int64(512)),
Messages: anthropic.F([]anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock(p)),
}),
})
if err != nil {
ch <- result{idx: idx, err: err}
return
}
ch <- result{idx: idx, text: msg.Content[0].Text}
}(i, prompt)
}
for i := 0; i < len(prompts); i++ {
r := <-ch
results[r.idx] = r
}
texts := make([]string, len(prompts))
for i, r := range results {
if r.err == nil {
texts[i] = r.text
}
}
return texts
}图片理解(Vision)
go
imageData, _ := os.ReadFile("screenshot.png")
encoded := base64.StdEncoding.EncodeToString(imageData)
msg, err := client.Messages.New(ctx, anthropic.MessageNewParams{
Model: anthropic.F(anthropic.ModelClaudeSonnet4_5),
MaxTokens: anthropic.F(int64(1024)),
Messages: anthropic.F([]anthropic.MessageParam{
anthropic.NewUserMessage(
anthropic.NewBase64ImageBlock(
anthropic.Base64ImageSourceMediaTypePNG,
encoded,
),
anthropic.NewTextBlock("分析这张截图中的问题"),
),
}),
})错误处理与重试
go
import "github.com/anthropics/anthropic-sdk-go/packages/apierror"
func callWithRetry(ctx context.Context, client *anthropic.Client, params anthropic.MessageNewParams) (*anthropic.Message, error) {
for attempt := 0; attempt < 3; attempt++ {
msg, err := client.Messages.New(ctx, params)
if err == nil {
return msg, nil
}
var apiErr *apierror.Error
if errors.As(err, &apiErr) && apiErr.StatusCode == 429 {
// Rate limit:等待后重试
time.Sleep(time.Duration(math.Pow(2, float64(attempt))) * time.Second)
continue
}
return nil, err // 非 Rate Limit 错误直接返回
}
return nil, fmt.Errorf("超过最大重试次数")
}来源:Anthropic Claude API 文档 - docs.anthropic.com/en/api