Go 运行时

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

函数准备

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

支持的 Go 运行时和基础映像

运行时 运行时 ID 堆栈 运行时基础映像
Go 1.23
go123
  • google-22(默认)
  • google-22-full
  • google-22/go123
  • google-22-full/go123
  • Go 1.22 go122
  • google-22(默认)
  • google-22-full
  • google-22/go122
  • google-22-full/go122
  • Go 1.21 go121
  • google-22(默认)
  • google-22-full
  • google-22/go121
  • google-22-full/go121
  • Go 1.20 go120
  • google-22(默认)
  • google-22-full
  • google-22/go120
  • google-22-full/go120
  • Go 1.19 go119
  • google-22(默认)
  • google-22-full
  • google-22/go119
  • google-22-full/go119
  • Go 1.18 go118
  • google-22(默认)
  • google-22-full
  • google-22/go118
  • google-22-full/go120
  • Go 1.16 go116 google-18-full google-18-full/go116
    Go 1.13 go113 google-18-full google-18-full/go113
    Go 1.11 go111 已停用 已停用

    选择运行时

    您可以在部署期间为您的函数选择受支持的 Go 运行时之一。

    您可以使用 Google Cloud 控制台或 gcloud CLI 选择运行时版本。点击相应标签页即可获取有关所选工具的使用说明:

    gcloud

    在部署函数时,使用 --base-image 标志为函数指定 Go 基础映像。例如:

    gcloud run deploy FUNCTION \
        --source . \
        --function FUNCTION_ENTRYPOINT \
        --base-image go122
    

    您需要进行如下替换:

    • FUNCTION 替换为您要部署的函数的名称。您可以完全省略此参数,但如果省略它,系统将提示您输入名称。

    • FUNCTION_ENTRYPOINT 替换为源代码中函数的入口点。这是 Cloud Run 在您的函数运行时执行的代码。此标志的值必须是源代码中存在的函数名称或完全限定类名称。

    如需详细了解如何使用 gcloud CLI 部署函数,请参阅在 Cloud Run 中部署函数

    控制台

    您可以在 Google Cloud 控制台中创建或更新 Cloud Run 函数时选择运行时版本。如需详细了解如何部署函数,请参阅在 Cloud Run 中部署函数

    如需在 Google Cloud 控制台中创建函数时选择运行时,请按以下步骤操作:

    1. 在 Google Cloud 控制台中,转到 Cloud Run 页面。

      转到 Cloud Run

    2. 点击编写函数

    3. 运行时列表中,选择 Go 运行时版本。

    4. 点击创建,然后等待 Cloud Run 使用占位符修订版创建服务。

    5. 控制台会将您重定向到来源标签页,您可以在其中查看函数的源代码。点击保存并重新部署

    如需详细了解如何在函数部署后更新运行时版本,请参阅重新部署新源代码

    源代码结构

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

    指定依赖项

    Go 中的 Cloud Run 函数必须通过 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
    }