教程

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 API Vision 图像理解完全指南:图片分析、截图解读与多图处理Claude API 视觉能力(Vision)完整使用指南:支持的图像格式(PNG/JPEG/GIF/WebP)与大小限制、Base64 编码图像传入方式、URL 直接引用图像、多张图片同时分析、图像与文字混合输入、典型应用场景(截图调试/图表解读/文档扫描/UI分析)、图像 Token 计算方式和成本优化,以及 Python/TypeScript 完整代码示例。2026/3/20教程Claude API 流式输出完全指南:Server-Sent Events 实时响应实战Claude API 流式输出(Streaming)完整教程:为什么用流式输出(用户体验提升50%+)、Server-Sent Events 协议原理、Python/Node.js/curl 三种实现方式、stream=True 的事件类型(message_start/content_block_delta/message_stop)、流式 Tool Use 的特殊处理、在 FastAPI/Express/Next.js 中实现流式 API 端点,以及流式输出的错误处理和超时配置。2026/3/20教程Anthropic Python SDK 完全指南:从安装到生产级集成的最佳实践Anthropic Python SDK 完整使用指南:安装配置、同步与异步客户端、流式输出、工具调用(Tool Use)、视觉 API、Prompt Caching、错误处理与重试、Token 用量追踪、httpx 客户端自定义,以及在 Django/FastAPI/Flask 框架中的集成最佳实践。2026/3/16教程Claude API Key 申请完整教程:从注册 Anthropic Console 到第一次调用Claude API Key 申请完整指南:Anthropic Console 注册、充值方式、API Key 生成与管理、Python/curl 第一次调用验证、用量监控、费用控制与限额设置,以及免费额度和各模型计费说明。2026/3/15