Go 运行时

概览

Cloud Run functions 函数在由操作系统版本、插件软件包、语言支持以及支持和调用函数的 Functions 框架库组成的环境中运行。此环境由语言版本进行标识,称为运行时。

如需了解运行时的一般信息以及每个 Go 运行时使用的 Ubuntu 版本,请参阅 Cloud Functions 执行环境

选择运行时

Cloud Functions 函数支持运行时支持页面上列出的多个 Go 版本。您可以在部署期间为您的函数选择首选 Go 运行时。

gcloud

如果您使用的是 Google Cloud CLI,请在您选择的 Go 运行时中使用 --runtime 参数来指定运行时。例如:

gcloud functions deploy FUNCTION_NAME --runtime go122 FLAGS...

FLAGS... 是指在第一次部署您的函数期间传递的参数。如需详细了解必需参数和可选参数,请参阅使用 Google Cloud CLI 进行部署

控制台

如果您使用的是 Google Cloud 控制台,请参阅 Google Cloud 控制台快速入门以获取详细说明。

函数准备

您可以直接在 Google Cloud 控制台中准备函数,也可以在本地机器上编写函数并上传该函数。如需准备本地机器以用于 Go 开发,请参阅设置 Go 开发环境

如需快速开始在 Cloud Functions 上使用 Go,请参阅快速入门

源代码结构

为了让 Cloud Run functions 找到函数的定义,源代码必须遵循特定结构。如需了解详情,请参阅编写 Cloud Run 函数

指定依赖项

Go 中的 Cloud Functions 函数必须通过 Go 模块和 go.mod 文件或者通过 vendor 目录提供其所有依赖项。如需了解详情,请参阅指定 Go 依赖项

环境变量

Go 运行时会自动根据需要为函数设置要使用的特定环境变量。如需了解详情,请参阅使用环境变量

Context 类型

Go 的 context 软件包定义了 Context 类型,该类型跨 API 边界和在进程之间传递截止时限、取消信号以及其他请求范围的值。

以下代码展示了 Pub/Sub 客户端的上下文访问示例:


// Package helloworld provides a set of Cloud Functions samples.
package helloworld

import (
	"context"
	"fmt"
	"log"

	"github.com/GoogleCloudPlatform/functions-framework-go/functions"
	"github.com/cloudevents/sdk-go/v2/event"
)

func init() {
	functions.CloudEvent("HelloPubSub", helloPubSub)
}

// MessagePublishedData contains the full Pub/Sub message
// See the documentation for more details:
// https://cloud.google.com/eventarc/docs/cloudevents#pubsub
type MessagePublishedData struct {
	Message PubSubMessage
}

// PubSubMessage is the payload of a Pub/Sub event.
// See the documentation for more details:
// https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage
type PubSubMessage struct {
	Data []byte `json:"data"`
}

// helloPubSub consumes a CloudEvent message and extracts the Pub/Sub message.
func helloPubSub(ctx context.Context, e event.Event) error {
	var msg MessagePublishedData
	if err := e.DataAs(&msg); err != nil {
		return fmt.Errorf("event.DataAs: %w", err)
	}

	name := string(msg.Message.Data) // Automatically decoded from base64.
	if name == "" {
		name = "World"
	}
	log.Printf("Hello, %s!", name)
	return nil
}