教程

Anthropic Claude SDK Go 完全接入指南:Go 语言调用 Claude API 实战(2026)

Anthropic 官方 Go SDK 完整使用指南:安装配置、基础消息调用、流式输出(Streaming)、多轮对话状态管理、System Prompt 设置、并发批量调用(信号量控制并发/Rate Limit)、图片视觉理解(Vision/Base64)、错误处理与自动重试,覆盖 Claude Sonnet/Haiku 全系列模型,附生产级代码示例。

2026/3/273分钟 阅读ClaudeEagle

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

相关文章推荐

教程Anthropic Claude SDK Java 完全接入指南:Java/Spring Boot 调用 Claude API(2026)Anthropic 官方 Java SDK 完整使用指南:Maven/Gradle 安装、基础消息调用、流式输出(Streaming/SSE)、Spring Boot 集成(@Bean/@Service/REST API)、多轮对话状态管理、异步调用(CompletableFuture 并发)、Spring WebFlux 流式 SSE 接口,覆盖 Claude Sonnet/Haiku 全系列模型,附企业级生产代码示例。2026/3/27教程Anthropic Node.js SDK 完全指南:TypeScript/JavaScript 接入 Claude APIAnthropic 官方 Node.js SDK(@anthropic-ai/sdk)完整教程:安装与初始化、基础对话调用、流式输出(stream)、图像输入(Base64/URL)、Tool Use 函数调用、系统提示、消息历史管理、Prompt Caching 配置、错误处理最佳实践(指数退避重试),以及 TypeScript 类型系统深度使用,适合 Node.js / Next.js / NestJS 开发者快速上手。2026/3/20教程Claude Code 官方最佳实践完全指南:Anthropic 工程团队总结的 25 条黄金法则Anthropic 官方 Best Practices 完整整理:核心约束(上下文管理);给 Claude 可验证标准(最高杠杆);探索→规划→实现→提交四步流程;精准提示 4 策略;丰富上下文输入方式;CLAUDE.md 有效写法(含 ✅/❌ 清单和 @ 引入语法);权限预设;CLI 工具配置;MCP 服务器选择;Hooks 自动化;Skills vs CLAUDE.md 选择;高效沟通技巧;会话管理(提前纠正/激进 /compact/Subagent 调研);以及非交互模式和多 Session 并行的规模化技巧。2026/5/8教程Anthropic Claude API 完整开发指南 2026:Prompt 缓存、自适应推理、工具调用全解析Claude API 2026 年完整开发指南:模型选型和最新定价(Haiku/Sonnet/Opus 对比)、Prompt 缓存实现(最高节省 90% 成本,含代码示例)、自适应推理替代旧 budget_tokens(含流式实现)、工具调用完整循环、流式响应(含 Next.js App Router 示例)、视觉能力(Opus 4.7 支持 3.75MP),以及生产最佳实践(重试、成本监控)。2026/4/24教程MCP 完整入门指南 2026:Model Context Protocol 是什么、为什么重要、怎么用MCP(Model Context Protocol)完整入门:解决的核心问题(定制集成 vs 通用协议)、三角色架构(Host/Client/Server)、三种能力(Tools/Resources/Prompts)、Stdio vs HTTP 传输、在 Claude Code 里配置常用 Server(GitHub/PostgreSQL/文件系统),以及用 TypeScript SDK 构建自己的 MCP Server。2026/4/21教程Claude Haiku 4 完全使用指南:高速低成本模型适合哪些场景?(2026)Claude Haiku 4 完整使用指南:Haiku 在三档模型中的定位($0.80/$4 每百万 Token)、最适合的 5 类场景(批量分类/实时对话/结构化提取/代码片段/内容审核)、与 Sonnet/Opus 的选型对比表、生产环境混合策略(动态模型选择降低 40-60% 成本),附 Claude Code 中使用 Haiku 批量处理的命令示例。2026/3/28