golang访问Google Cloud API服务的客户端插件库google-cloud的使用
Golang访问Google Cloud API服务的客户端插件库google-cloud的使用
Google Cloud Go客户端库
Go语言用于Google Cloud Platform服务的软件包。
安装
go get cloud.google.com/go/firestore@latest # 将firestore替换为您想使用的包
注意: 其中一些软件包正在开发中,可能会偶尔做出不兼容的更改。
支持的API
有关我们所有已发布API的最新列表,请参阅我们的参考文档。
支持的Go版本
我们的库与最近两个主要Go版本兼容,这与Go编程语言遵循的策略相同。目前支持的版本是:
- Go 1.23
- Go 1.24
认证
默认情况下,每个客户端库将使用应用程序默认凭据(ADC)自动配置调用API端点时使用的凭据。在Google Cloud Platform环境(如Compute Engine、Kubernetes Engine或App Engine)中使用库时,无需额外的认证步骤。
client, err := storage.NewClient(ctx)
对于在其他地方运行的应用程序,例如本地开发环境,您可以使用Google Cloud CLI中的gcloud auth application-default login
命令在本地文件系统中设置用户凭据。应用程序默认凭据将自动检测这些凭据。
或者,您可能需要提供凭据的显式路径。要使用服务帐户密钥文件进行身份验证,可以将GOOGLE_APPLICATION_CREDENTIALS
环境变量设置为密钥文件的路径,或者以编程方式将option.WithCredentialsFile
传递给所需包的NewClient
函数。例如:
client, err := storage.NewClient(ctx, option.WithCredentialsFile("path/to/keyfile.json"))
您可以使用credentials包创建auth.Credentials来对认证进行更多控制。然后将option.WithAuthCredentials
传递给NewClient
函数:
creds, err := credentials.DetectDefault(&credentials.DetectOptions{...})
...
client, err := storage.NewClient(ctx, option.WithAuthCredentials(creds))
完整示例
以下是一个使用Google Cloud Storage的完整示例:
package main
import (
"context"
"fmt"
"io"
"log"
"cloud.google.com/go/storage"
"google.golang.org/api/iterator"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
// 使用默认凭据创建客户端
client, err := storage.NewClient(ctx)
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
defer client.Close()
// 或者使用服务帐户密钥文件
// client, err := storage.NewClient(ctx, option.WithCredentialsFile("path/to/keyfile.json"))
// 列出所有存储桶
it := client.Buckets(ctx, "your-project-id")
for {
bucketAttrs, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Fatalf("Failed to list buckets: %v", err)
}
fmt.Printf("Bucket: %v\n", bucketAttrs.Name)
}
// 读取存储桶中的对象
bucketName := "your-bucket-name"
objectName := "your-object-name"
rc, err := client.Bucket(bucketName).Object(objectName).NewReader(ctx)
if err != nil {
log.Fatalf("Failed to read object: %v", err)
}
defer rc.Close()
data, err := io.ReadAll(rc)
if err != nil {
log.Fatalf("Failed to read data: %v", err)
}
fmt.Printf("Object contents: %s\n", data)
}
贡献
欢迎贡献。详情请参阅贡献文档。
请注意,本项目发布时附有贡献者行为准则。参与本项目即表示您同意遵守其条款。
更多关于golang访问Google Cloud API服务的客户端插件库google-cloud的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang访问Google Cloud API服务的客户端插件库google-cloud的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Golang访问Google Cloud API的google-cloud-go库
Google官方提供了Golang客户端库google-cloud-go
,用于访问各种Google Cloud服务。下面我将介绍如何使用这个库来访问Google Cloud API服务。
安装
首先需要安装对应服务的客户端库。google-cloud-go
是一个模块化库,每个Google Cloud服务都有独立的子模块。例如:
# 安装核心库
go get cloud.google.com/go
# 安装特定服务库,例如Storage
go get cloud.google.com/go/storage
认证设置
访问Google Cloud API需要认证凭证。有以下几种认证方式:
-
使用应用默认凭证(ADC) - 推荐方式
import "google.golang.org/api/option" // 会自动从以下位置查找凭证: // 1. GOOGLE_APPLICATION_CREDENTIALS环境变量指定的文件 // 2. ~/.config/gcloud/application_default_credentials.json // 3. App Engine/Cloud Run/Compute Engine等环境内置的凭证 client, err := storage.NewClient(ctx)
-
使用服务账号密钥文件
client, err := storage.NewClient(ctx, option.WithCredentialsFile("/path/to/service-account.json"))
-
使用API密钥 (仅适用于部分API)
client, err := storage.NewClient(ctx, option.WithAPIKey("YOUR_API_KEY"))
常用服务示例
1. Cloud Storage 示例
package main
import (
"context"
"fmt"
"io"
"log"
"cloud.google.com/go/storage"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
// 创建客户端
client, err := storage.NewClient(ctx, option.WithCredentialsFile("path/to/credentials.json"))
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
defer client.Close()
// 指定bucket和object
bucketName := "your-bucket-name"
objectName := "example.txt"
// 上传文件
wc := client.Bucket(bucketName).Object(objectName).NewWriter(ctx)
if _, err := io.WriteString(wc, "Hello, Google Cloud Storage!"); err != nil {
log.Fatalf("Failed to write: %v", err)
}
if err := wc.Close(); err != nil {
log.Fatalf("Failed to close writer: %v", err)
}
fmt.Println("File uploaded successfully")
// 下载文件
rc, err := client.Bucket(bucketName).Object(objectName).NewReader(ctx)
if err != nil {
log.Fatalf("Failed to read object: %v", err)
}
defer rc.Close()
data, err := io.ReadAll(rc)
if err != nil {
log.Fatalf("Failed to read data: %v", err)
}
fmt.Printf("File content: %s\n", data)
}
2. Cloud Pub/Sub 示例
package main
import (
"context"
"fmt"
"log"
"cloud.google.com/go/pubsub"
)
func main() {
ctx := context.Background()
// 创建客户端
client, err := pubsub.NewClient(ctx, "your-project-id")
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
defer client.Close()
// 创建topic
topicName := "example-topic"
topic := client.Topic(topicName)
exists, err := topic.Exists(ctx)
if err != nil {
log.Fatalf("Failed to check topic existence: %v", err)
}
if !exists {
if _, err := client.CreateTopic(ctx, topicName); err != nil {
log.Fatalf("Failed to create topic: %v", err)
}
}
// 发布消息
result := topic.Publish(ctx, &pubsub.Message{
Data: []byte("Hello, Pub/Sub!"),
})
msgID, err := result.Get(ctx)
if err != nil {
log.Fatalf("Failed to publish message: %v", err)
}
fmt.Printf("Published message with ID: %s\n", msgID)
// 创建订阅
subName := "example-subscription"
sub := client.Subscription(subName)
exists, err = sub.Exists(ctx)
if err != nil {
log.Fatalf("Failed to check subscription existence: %v", err)
}
if !exists {
if _, err := client.CreateSubscription(ctx, subName, pubsub.SubscriptionConfig{
Topic: topic,
}); err != nil {
log.Fatalf("Failed to create subscription: %v", err)
}
}
// 接收消息
err = sub.Receive(ctx, func(ctx context.Context, msg *pubsub.Message) {
fmt.Printf("Received message: %s\n", string(msg.Data))
msg.Ack()
})
if err != nil {
log.Fatalf("Failed to receive messages: %v", err)
}
}
3. Cloud Firestore 示例
package main
import (
"context"
"fmt"
"log"
"cloud.google.com/go/firestore"
)
type User struct {
Name string
Email string
Age int
}
func main() {
ctx := context.Background()
// 创建客户端
client, err := firestore.NewClient(ctx, "your-project-id")
if err != nil {
log.Fatalf("Failed to create client: %v", err)
}
defer client.Close()
// 添加文档
users := client.Collection("users")
docRef, _, err := users.Add(ctx, User{
Name: "John Doe",
Email: "john@example.com",
Age: 30,
})
if err != nil {
log.Fatalf("Failed adding document: %v", err)
}
fmt.Printf("Added document with ID: %s\n", docRef.ID)
// 查询文档
iter := users.Where("Age", ">=", 25).Documents(ctx)
for {
doc, err := iter.Next()
if err != nil {
break
}
var u User
if err := doc.DataTo(&u); err != nil {
log.Printf("Failed to parse document: %v", err)
continue
}
fmt.Printf("User: %+v\n", u)
}
}
最佳实践
- 重用客户端:客户端是线程安全的,应该重用而不是频繁创建和关闭
- 上下文管理:使用context.Context来控制请求超时和取消
- 错误处理:正确处理所有错误,Google Cloud API返回的错误通常包含丰富的信息
- 资源清理:使用defer确保客户端和资源被正确关闭
- 性能优化:对于批量操作,考虑使用批处理API
总结
google-cloud-go
库提供了简单直观的API来访问各种Google Cloud服务。通过合理的认证设置和遵循最佳实践,您可以轻松地在Golang应用中集成Google Cloud服务。