安装 Go
Go 支持多种操作系统,包括 Windows、macOS 和 Linux。你可以从官网下载安装包,或使用包管理器进行安装。
# macOS 使用 Homebrew
$ brew install go
# Ubuntu/Debian
$ sudo apt-get install golang-go
# 验证安装
$ go version
go version go1.24.0 darwin/arm64
Hello World
让我们从经典的 "Hello, World!" 程序开始。创建一个名为 main.go 的文件:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
运行程序:
$ go run main.go
Hello, World!
工作空间
Go 使用工作空间(workspace)来组织代码。从 Go 1.18 开始,可以使用 go.work 文件管理多模块工作空间。
# 初始化工作空间
$ go work init ./module1 ./module2
# 查看工作空间结构
$ cat go.work
go 1.24
use (
./module1
./module2
)
模块管理
Go Modules 是 Go 的官方依赖管理工具,从 Go 1.11 开始引入,Go 1.16 后成为默认方式。
# 初始化模块
$ go mod init github.com/username/project
# 下载依赖
$ go mod tidy
# 查看依赖
$ go list -m all
# 更新依赖
$ go get -u ./...
变量与常量
Go 使用 var 关键字声明变量,使用 const 关键字声明常量。支持类型推断和短变量声明。
package main
import "fmt"
func main() {
// 完整声明
var name string = "Go"
// 类型推断
var age = 15
// 短变量声明(函数内使用)
version := 1.24
// 常量
const Pi = 3.14159
// 多变量声明
var a, b, c int = 1, 2, 3
fmt.Println(name, age, version, Pi, a, b, c)
}
函数
函数是 Go 的核心构建块。支持多返回值、变长参数、匿名函数和闭包。
package main
import "fmt"
// 基本函数
func add(a, b int) int {
return a + b
}
// 多返回值
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("cannot divide by zero")
}
return a / b, nil
}
// 变长参数
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
func main() {
fmt.Println(add(3, 5))
result, err := divide(10, 2)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
fmt.Println(sum(1, 2, 3, 4, 5))
}
结构体
结构体(struct)是 Go 中自定义类型的主要方式,用于组合相关字段。支持嵌入类型和方法。
package main
import "fmt"
// 定义结构体
type Person struct {
Name string
Age int
Email string
}
// 方法
func (p Person) Info() string {
return fmt.Sprintf("%s is %d years old", p.Name, p.Age)
}
// 指针接收者方法(可修改原值)
func (p *Person) Birthday() {
p.Age++
}
func main() {
// 创建实例
p1 := Person{Name: "Alice", Age: 30, Email: "alice@example.com"}
// 使用 new
p2 := new(Person)
p2.Name = "Bob"
p2.Age = 25
fmt.Println(p1.Info())
p1.Birthday()
fmt.Println(p1.Info())
}
接口
接口定义了一组方法签名。Go 的接口是隐式实现的,无需显式声明实现了哪个接口。
package main
import "fmt"
// 定义接口
type Shape interface {
Area() float64
Perimeter() float64
}
// 矩形
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
// 圆形
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14159 * c.Radius
}
func PrintShapeInfo(s Shape) {
fmt.Printf("Area: %.2f, Perimeter: %.2f\n", s.Area(), s.Perimeter())
}
func main() {
r := Rectangle{Width: 10, Height: 5}
c := Circle{Radius: 7}
PrintShapeInfo(r)
PrintShapeInfo(c)
}
并发编程
Go 语言的并发模型基于 CSP(通信顺序进程),通过 goroutine 和 channel 实现:
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Printf("worker %d processing job %d\n", id, j)
time.Sleep(time.Second)
results <- j * 2
}
}
func main() {
jobs := make(chan int, 100)
results := make(chan int, 100)
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
for a := 1; a <= 5; a++ {
<-results
}
}
Go 语言 AI 开发概览 AI
Go 语言凭借其出色的并发性能和简洁的语法,成为构建 AI 应用后端的理想选择。2026年,Go 在 AI 领域的生态系统日趋成熟,支持各种主流大语言模型和 AI 服务。
Go 的高并发特性使其能够高效处理大量 AI 推理请求,内存占用低、启动速度快,非常适合构建 AI 微服务和 Serverless 应用。
主流 AI 服务 Go SDK
Anthropic Go
官方 Go SDK,支持 Claude 4.6 系列模型
Google GenAI
Gemini 2.0 系列模型 Go 客户端
Ollama Go
本地大模型部署与调用
Pinecone
向量数据库 Go 客户端
LLM API 调用 AI
使用 Go 调用 Anthropic API 进行聊天补全,支持最新的 Claude 4.6 模型:
package main
import (
"context"
"fmt"
"os"
"github.com/anthropics/anthropic-go"
)
func main() {
client := anthropic.NewClient(
os.Getenv("ANTHROPIC_API_KEY"),
)
resp, err := client.Messages.Create(
context.TODO(),
anthropic.MessageNewParams{
Model: "claude-4-6-sonnet-20260325",
MaxTokens: 2000,
Messages: []anthropic.MessageParam{
{
Role: "user",
Content: "用 Go 写一个快速排序",
},
},
Temperature: 0.7,
},
)
if err != nil {
panic(err)
}
fmt.Println(resp.Content[0].Text)
}
Claude 4.6 Opus 调用示例
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/anthropics/anthropic-go"
)
func main() {
client := anthropic.NewClient(
os.Getenv("ANTHROPIC_API_KEY"),
)
resp, err := client.Messages.Create(
context.Background(),
anthropic.MessageNewParams{
Model: "claude-4-6-opus-20260325",
MaxTokens: 4096,
Messages: []anthropic.MessageParam{
{
Role: "user",
Content: "解释 Go 的 channel 机制",
},
},
Temperature: 0.7,
},
)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Content[0].Text)
}
流式响应处理 AI
实现 SSE (Server-Sent Events) 流式输出,提供流畅的 AI 对话体验:
package main
import (
"context"
"encoding/json"
"fmt"
"net/http"
"github.com/anthropics/anthropic-go"
)
type StreamHandler struct {
client *anthropic.Client
}
func (h *StreamHandler) HandleChat(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
stream, err := h.client.Messages.CreateStreaming(
r.Context(),
anthropic.MessageNewParams{
Model: "claude-4-6-sonnet-20260325",
MaxTokens: 2000,
Messages: []anthropic.MessageParam{
{
Role: "user",
Content: r.URL.Query().Get("q"),
},
},
},
)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
flusher, _ := w.(http.Flusher)
for stream.Next() {
event := stream.Current()
if event.Type == "content_block_delta" {
data, _ := json.Marshal(map[string]string{
"content": event.Delta.Text,
})
fmt.Fprintf(w, "data: %s\n\n", data)
flusher.Flush()
}
}
}
文本嵌入向量 AI
使用 Embedding API 将文本转换为向量,用于语义搜索和相似度计算:
package embedding
import (
"context"
"math"
"github.com/anthropics/anthropic-go"
)
type EmbeddingService struct {
client *anthropic.Client
}
func (s *EmbeddingService) CreateEmbedding(
ctx context.Context,
text string,
) ([]float32, error) {
resp, err := s.client.Embeddings.Create(ctx,
anthropic.EmbeddingNewParams{
Model: "claude-embedding-3",
Input: text,
})
if err != nil {
return nil, err
}
return resp.Embedding, nil
}
// CosineSimilarity 计算两个向量的余弦相似度
func CosineSimilarity(a, b []float32) float64 {
var dotProduct, normA, normB float64
for i := 0; i < len(a); i++ {
dotProduct += float64(a[i] * b[i])
normA += float64(a[i] * a[i])
normB += float64(b[i] * b[i])
}
return dotProduct / (math.Sqrt(normA) * math.Sqrt(normB))
}
RAG 检索增强生成 AI
构建 RAG 系统,结合向量数据库实现知识库问答:
package rag
import (
"context"
"fmt"
"strings"
"github.com/anthropics/anthropic-go"
"github.com/pgvector/pgvector-go"
"github.com/jackc/pgx/v5"
)
type RAGService struct {
llm *anthropic.Client
db *pgx.Conn
embedder *EmbeddingService
}
// AddDocument 添加文档到知识库
func (r *RAGService) AddDocument(
ctx context.Context,
content string,
) error {
embedding, err := r.embedder.CreateEmbedding(ctx, content)
if err != nil {
return err
}
_, err = r.db.Exec(ctx,
`INSERT INTO documents (content, embedding)
VALUES ($1, $2)`,
content, pgvector.NewVector(embedding))
return err
}
// Query 执行 RAG 查询
func (r *RAGService) Query(
ctx context.Context,
question string,
) (string, error) {
// 1. 获取问题的向量表示
queryEmbedding, err := r.embedder.CreateEmbedding(ctx, question)
if err != nil {
return "", err
}
// 2. 检索相似文档
rows, err := r.db.Query(ctx,
`SELECT content FROM documents
ORDER BY embedding <=> $1 LIMIT 5`,
pgvector.NewVector(queryEmbedding))
if err != nil {
return "", err
}
defer rows.Close()
var contexts []string
for rows.Next() {
var content string
rows.Scan(&content)
contexts = append(contexts, content)
}
// 3. 构建增强提示
prompt := fmt.Sprintf(`基于以下上下文回答问题:
%s
问题:%s`,
strings.Join(contexts, "\n\n"), question)
// 4. 调用 Claude 生成回答
resp, err := r.llm.Messages.Create(ctx,
anthropic.MessageNewParams{
Model: "claude-4-6-sonnet-20260325",
MaxTokens: 2000,
Messages: []anthropic.MessageParam{
{
Role: "user",
Content: "你是一个知识库助手。\n\n" + prompt,
},
},
})
if err != nil {
return "", err
}
return resp.Content[0].Text, nil
}
AI Agent 开发 AI
构建具备工具调用能力的 AI Agent,实现自动化任务处理:
package agent
import (
"context"
"encoding/json"
"fmt"
"github.com/anthropics/anthropic-go"
)
type Tool struct {
Name string
Description string
Parameters map[string]interface{}
Handler func(map[string]interface{}) (string, error)
}
type Agent struct {
client *anthropic.Client
tools map[string]*Tool
}
func (a *Agent) RegisterTool(tool *Tool) {
a.tools[tool.Name] = tool
}
func (a *Agent) Run(ctx context.Context, input string) (string, error) {
messages := []anthropic.MessageParam{
{
Role: "user",
Content: "你是一个 helpful 助手,可以调用工具完成任务。\n\n" + input,
},
}
// 构建工具定义
var toolDefs []anthropic.ToolParam
for _, tool := range a.tools {
toolDefs = append(toolDefs, anthropic.ToolParam{
Name: tool.Name,
Description: tool.Description,
InputSchema: tool.Parameters,
})
}
// 第一次调用,可能触发工具调用
resp, err := a.client.Messages.Create(ctx,
anthropic.MessageNewParams{
Model: "claude-4-6-sonnet-20260325",
MaxTokens: 2000,
Messages: messages,
Tools: toolDefs,
})
if err != nil {
return "", err
}
// 处理工具调用
if len(resp.Content) > 0 && resp.Content[0].Type == "tool_use" {
toolUse := resp.Content[0].ToolUse
tool := a.tools[toolUse.Name]
var args map[string]interface{}
json.Unmarshal([]byte(toolUse.Input), &args)
result, err := tool.Handler(args)
if err != nil {
result = fmt.Sprintf("Error: %v", err)
}
// 添加工具调用结果到上下文
messages = append(messages, anthropic.MessageParam{
Role: "assistant",
Content: fmt.Sprintf("Tool: %s, Result: %s",
toolUse.Name, result),
})
// 第二次调用获取最终回答
finalResp, _ := a.client.Messages.Create(ctx,
anthropic.MessageNewParams{
Model: "claude-4-6-sonnet-20260325",
MaxTokens: 2000,
Messages: messages,
})
return finalResp.Content[0].Text, nil
}
return resp.Content[0].Text, nil
}
向量数据库 AI
使用 Pinecone 进行高性能向量检索:
package vectordb
import (
"context"
"github.com/pinecone-io/go-pinecone/pinecone"
)
type PineconeStore struct {
client *pinecone.Client
index pinecone.IndexInterface
indexName string
}
func NewPineconeStore(apiKey, indexName string) (*PineconeStore, error) {
client, err := pinecone.NewClient(
pinecone.NewClientParams{ApiKey: apiKey})
if err != nil {
return nil, err
}
index, err := client.Index(
context.Background(),
pinecone.NewIndexParams{Host: "your-index-host"})
if err != nil {
return nil, err
}
return &PineconeStore{
client: client,
index: index,
indexName: indexName,
}, nil
}
func (s *PineconeStore) UpsertVectors(
ctx context.Context,
vectors []pinecone.Vector,
) error {
_, err := s.index.UpsertVectors(ctx, &pinecone.UpsertVectorsRequest{
Vectors: vectors,
})
return err
}
func (s *PineconeStore) Query(
ctx context.Context,
vector []float32,
topK uint32,
) ([]pinecone.ScoredVector, error) {
resp, err := s.index.Query(ctx, &pinecone.QueryRequest{
Vector: vector,
TopK: topK,
IncludeValues: false,
})
if err != nil {
return nil, err
}
return resp.Matches, nil
}
MCP 协议集成 AI NEW
Model Context Protocol (MCP) 是 2026 年推出的开放协议,用于标准化 AI 模型与外部工具的交互:
MCP (Model Context Protocol) 是由 Anthropic 提出的开放标准,旨在统一 AI 模型与数据源、工具之间的通信方式,类似于 AI 世界的 "USB-C" 接口。
package mcp
import (
"os"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
type MCPServer struct {
server *mcp.Server
tools map[string]MCPTool
}
type MCPTool struct {
Name string `json:"name"`
Description string `json:"description"`
InputSchema map[string]interface{} `json:"inputSchema"`
Handler func(map[string]interface{}) (*mcp.CallToolResult, error)
}
func NewMCPServer(name, version string) *MCPServer {
s := &MCPServer{
server: mcp.NewServer(
mcp.WithName(name),
mcp.WithVersion(version),
),
tools: make(map[string]MCPTool),
}
return s
}
func (s *MCPServer) RegisterTool(tool MCPTool) {
s.tools[tool.Name] = tool
s.server.AddTool(mcp.Tool{
Name: tool.Name,
Description: tool.Description,
InputSchema: tool.InputSchema,
}, tool.Handler)
}
// 示例:文件系统工具
func FileSystemTool() MCPTool {
return MCPTool{
Name: "read_file",
Description: "读取文件内容",
InputSchema: map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"path": map[string]string{
"type": "string",
"description": "文件路径",
},
},
"required": []string{"path"},
},
Handler: func(args map[string]interface{}) (*mcp.CallToolResult, error) {
path := args["path"].(string)
content, err := os.ReadFile(path)
if err != nil {
return &mcp.CallToolResult{
Content: []mcp.Content{
{Type: "text", Text: err.Error()},
},
IsError: true,
}, nil
}
return &mcp.CallToolResult{
Content: []mcp.Content{
{Type: "text", Text: string(content)},
},
}, nil
},
}
}
智能聊天机器人 PROJECT
使用 Gin 框架构建支持上下文记忆的 AI 聊天机器人:
package main
import (
"net/http"
"os"
"sync"
"github.com/gin-gonic/gin"
"github.com/anthropics/anthropic-go"
)
type ChatBot struct {
client *anthropic.Client
sessions map[string][]anthropic.MessageParam
mu sync.RWMutex
}
func (b *ChatBot) HandleChat(c *gin.Context) {
var req struct {
SessionID string `json:"session_id"`
Message string `json:"message"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
b.mu.Lock()
defer b.mu.Unlock()
messages := b.sessions[req.SessionID]
messages = append(messages, anthropic.MessageParam{
Role: "user",
Content: req.Message,
})
resp, err := b.client.Messages.Create(c,
anthropic.MessageNewParams{
Model: "claude-4-6-haiku-20260325",
MaxTokens: 1000,
Messages: messages,
})
if err != nil {
c.JSON(500, gin.H{"error": err.Error()})
return
}
reply := resp.Content[0].Text
messages = append(messages, anthropic.MessageParam{
Role: "assistant",
Content: reply,
})
b.sessions[req.SessionID] = messages
c.JSON(200, gin.H{"reply": reply})
}
func main() {
bot := &ChatBot{
client: anthropic.NewClient(os.Getenv("ANTHROPIC_API_KEY")),
sessions: make(map[string][]anthropic.MessageParam),
}
r := gin.Default()
r.POST("/chat", bot.HandleChat)
r.Run(":8080")
}
代码助手 PROJECT
基于 Claude 4.6 的智能代码助手,支持代码补全、重构和解释:
package main
import (
"context"
"fmt"
"github.com/anthropics/anthropic-go"
)
type CodeAssistant struct {
client *anthropic.Client
}
func (ca *CodeAssistant) CompleteCode(
ctx context.Context,
prompt string,
language string,
) (string, error) {
systemPrompt := fmt.Sprintf(
"你是一个专业的 %s 代码助手。请根据用户的描述生成代码。",
language,
)
resp, err := ca.client.Messages.Create(ctx,
anthropic.MessageNewParams{
Model: "claude-4-6-sonnet-20260325",
MaxTokens: 2000,
Messages: []anthropic.MessageParam{
{
Role: "user",
Content: systemPrompt + "\n\n" + prompt,
},
},
})
if err != nil {
return "", err
}
return resp.Content[0].Text, nil
}
func (ca *CodeAssistant) ExplainCode(
ctx context.Context,
code string,
) (string, error) {
resp, err := ca.client.Messages.Create(ctx,
anthropic.MessageNewParams{
Model: "claude-4-6-sonnet-20260325",
MaxTokens: 1500,
Messages: []anthropic.MessageParam{
{
Role: "user",
Content: "请详细解释以下代码的工作原理:\n\n```\n" + code + "\n```",
},
},
})
if err != nil {
return "", err
}
return resp.Content[0].Text, nil
}
AI 图像生成 PROJECT
使用多模态 AI 实现图像理解和生成:
package main
import (
"context"
"encoding/base64"
"os"
"github.com/anthropics/anthropic-go"
)
type ImageService struct {
client *anthropic.Client
}
// AnalyzeImage 分析图像内容
func (s *ImageService) AnalyzeImage(
ctx context.Context,
imagePath string,
) (string, error) {
imageData, err := os.ReadFile(imagePath)
if err != nil {
return "", err
}
base64Image := base64.StdEncoding.EncodeToString(imageData)
resp, err := s.client.Messages.Create(ctx,
anthropic.MessageNewParams{
Model: "claude-4-6-sonnet-20260325",
MaxTokens: 1000,
Messages: []anthropic.MessageParam{
{
Role: "user",
Content: []anthropic.ContentBlock{
{
Type: "image",
Source: &anthropic.ImageSource{
Type: "base64",
MediaType: "image/png",
Data: base64Image,
},
},
{
Type: "text",
Text: "请描述这张图片的内容",
},
},
},
},
})
if err != nil {
return "", err
}
return resp.Content[0].Text, nil
}