跳到主要内容

Go 快速开始

准备工作

在开始之前,请确保您已完成以下准备:

  1. 开通云开发环境开通云开发环境
  2. 获取 API 访问凭证:在 CloudBase 控制台 获取环境 ID 和 API 密钥

更多详情请参考:Go 完整文档

添加 CloudBase AI 开发插件

可选:如果你使用 AI 编程助手(如 Cursor、Claude Code、CodeBuddy 等)进行开发,建议先完成本步骤,让 AI 具备 CloudBase 开发能力。

复制 AI Prompt 粘贴到 AI IDE

在 AI 对话中输入:

帮我把 CloudBase 接好,按下面做:
1. 打开 https://docs.cloudbase.net/skill.md,按说明完成接入。
2. 接入完成后告诉我,并建议最相关的下一步。

查看 skill.md →

使用 Skills 开发

对 AI 说:

使用 CloudBase Skills:在 Go 后端服务中集成 CloudBase HTTP API,包括数据库和存储功能

Skills 使用文档 →

也可以手动安装 CloudBase Skills:

npx skills add tencentcloudbase/cloudbase-skills -y

身份认证

package main

import "fmt"

func SignIn(username, password string) (map[string]interface{}, error) {
result, err := Cloudbase.Request("POST", "/auth/v1/signin",
map[string]interface{}{
"username": username,
"password": password,
}, nil)

if err != nil {
return nil, err
}

if resultMap, ok := result.(map[string]interface{}); ok {
accessToken := resultMap["access_token"].(string)
userID := resultMap["sub"].(string)

fmt.Printf("登录成功! 用户ID: %s\n", userID)
fmt.Printf("访问令牌: %s...\n", accessToken[:20])
return resultMap, nil
}

return nil, fmt.Errorf("登录失败")
}

// 使用示例
func main() {
result, err := SignIn("your_username", "your_password")
if err != nil {
fmt.Println("错误:", err)
}
}

云存储

package main

import (
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"time"
)

func UploadFile(filePath, objectID string) (map[string]interface{}, error) {
if objectID == "" {
filename := filepath.Base(filePath)
timestamp := time.Now().UnixMilli()
objectID = fmt.Sprintf("uploads/%d-%s", timestamp, filename)
}

uploadInfo, err := Cloudbase.Request("POST", "/v1/storages/get-objects-upload-info",
[]map[string]interface{}{{"objectId": objectID}}, nil)

if err != nil {
return nil, err
}

infoList, ok := uploadInfo.([]interface{})
if !ok || len(infoList) == 0 {
return nil, fmt.Errorf("获取上传信息失败")
}

info := infoList[0].(map[string]interface{})
uploadURL := info["uploadUrl"].(string)

file, err := os.Open(filePath)
if err != nil {
return nil, fmt.Errorf("文件不存在: %s", filePath)
}
defer file.Close()

fileData, err := io.ReadAll(file)
if err != nil {
return nil, fmt.Errorf("读取文件失败: %w", err)
}

req, err := http.NewRequest("PUT", uploadURL, bytes.NewReader(fileData))
if err != nil {
return nil, err
}

req.Header.Set("Authorization", info["authorization"].(string))
req.Header.Set("X-Cos-Security-Token", info["token"].(string))
req.Header.Set("X-Cos-Meta-Fileid", info["cloudObjectMeta"].(string))

client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("文件上传失败: %w", err)
}
defer resp.Body.Close()

if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return nil, fmt.Errorf("上传失败,状态码: %d", resp.StatusCode)
}

result := map[string]interface{}{
"cloudObjectId": info["cloudObjectId"],
"downloadUrl": info["downloadUrl"],
"objectId": objectID,
}

fmt.Println("文件上传成功:")
fmt.Printf("- 对象ID: %s\n", result["objectId"])
fmt.Printf("- 下载URL: %s\n", result["downloadUrl"])

return result, nil
}

// 使用示例
func main() {
result, err := UploadFile("./example.jpg", "")
if err != nil {
fmt.Println("错误:", err)
}
}

云函数

package main

import "fmt"

func CallFunction(functionName string, data map[string]interface{}) (interface{}, error) {
if data == nil {
data = map[string]interface{}{}
}

path := fmt.Sprintf("/v1/functions/%s", functionName)
result, err := Cloudbase.Request("POST", path, data, nil)

if err != nil {
return nil, err
}

fmt.Println("云函数调用结果:", result)
return result, nil
}

// 使用示例
func main() {
result, err := CallFunction("{%FUNCTION_NAME%}", nil)
if err != nil {
fmt.Println("错误:", err)
}
}

大模型

package main

import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"net/http"
"strings"
)

func StreamText(model, subModel string, messages []map[string]string) (string, error) {
payload := map[string]interface{}{
"model": subModel,
"messages": messages,
"stream": true,
}

jsonData, err := json.Marshal(payload)
if err != nil {
return "", err
}

url := fmt.Sprintf("%s/v1/ai/%s/chat/completions", Cloudbase.BaseURL, model)
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
return "", err
}

req.Header.Set("Content-Type", "application/json")
req.Header.Set("Accept", "text/event-stream")
req.Header.Set("Authorization", "Bearer "+Cloudbase.AccessToken)

resp, err := Cloudbase.HTTPClient.Do(req)
if err != nil {
return "", fmt.Errorf("AI 调用失败: %w", err)
}
defer resp.Body.Close()

fmt.Println("AI 流式响应:")
fullContent := ""
scanner := bufio.NewScanner(resp.Body)

for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, "data: ") {
dataStr := strings.TrimPrefix(line, "data: ")
if strings.TrimSpace(dataStr) != "[DONE]" {
var chunkData map[string]interface{}
if err := json.Unmarshal([]byte(dataStr), &chunkData); err == nil {
if choices, ok := chunkData["choices"].([]interface{}); ok && len(choices) > 0 {
if choice, ok := choices[0].(map[string]interface{}); ok {
if delta, ok := choice["delta"].(map[string]interface{}); ok {
if content, ok := delta["content"].(string); ok {
fmt.Print(content)
fullContent += content
}
}
}
}
}
}
}
}

fmt.Println()
return fullContent, nil
}

// 使用示例
func main() {
response, err := StreamText(
"{%AI_MODEL_NAME%}",
"{%AI_SUB_MODEL_NAME%}",
[]map[string]string{
{"role": "system", "content": "请严格按照七言绝句或七言律诗的格律要求创作,平仄需符合规则,押韵要和谐自然,韵脚字需在同一韵部。"},
{"role": "user", "content": "春天"},
},
)
if err != nil {
fmt.Println("错误:", err)
}
}