Go 執行階段

Cloud Functions Go 執行階段是以 Go 1.11.6 版為基礎。如要瞭解如何準備本機電腦以進行 Go 開發作業,請參閱設定 Go 開發環境一文。

如要在 Cloud Functions 中開始使用 Go,請參閱快速入門導覽課程

選取執行階段

在部署期間,您可以針對函式選取 Go 執行階段。

gcloud

如果您使用的是 gcloud 指令列工具,則可以使用 --runtime 參數指定執行階段,例如:

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

FLAGS... 是在第一次部署函式時所傳送的引數。如要進一步瞭解必要和選用引數,請參閱使用 gcloud 工具進行部署一節。

主控台

如果您使用的是 GCP 主控台,可在建立及部署函式時選取執行階段。

  1. 前往 GCP 主控台的「Cloud Functions Overview」(Cloud Functions 總覽) 頁面。

    前往「Cloud Functions Overview」(Cloud Functions 總覽) 頁面

    請確保選取的是已啟用 Cloud Functions 的專案。

  2. 按一下 [Create Function] (建立函式)

  3. 在「Runtime」(執行階段) 下,選取 [Go 1.11]。

執行環境

執行環境包括執行階段、作業系統、套件以及叫用函式的程式庫。

Go 執行階段使用以 Ubuntu 18.04 和 Go 1.11.6 版本為基礎的執行環境。詳情請參閱 Cloud Functions 執行環境一文。

原始碼結構

為使 Cloud Functions 能夠找到您函式的定義,每個執行階段都對原始碼有一定的結構要求。詳情請參閱編寫 Cloud 函式一文。

指定依附元件

以 Go 編寫的 Cloud 函式必須透過含 go.mod 檔案的 Go 模組或 vendor 目錄提供所有依附元件。詳情請參閱在 Go 中指定依附元件一文。

一次性初始化

您的函式可能需要進行一次性初始化,例如建立 API 用戶端和設定資料庫存取權,方法有好幾種:

  • 在函式的新執行個體啟動時,使用 func init() 函式初始化值。請注意,func init() 函式中的程式碼會在您的函式收到第一項要求之前執行。

  • 針對每個 Cloud Functions 執行個體,分別使用 sync.Once.Do() 函式執行程式碼一次。如果您只想按需求進行初始化,而不想在一開始啟動函式執行個體時進行初始化,這種做法就非常實用。例如,您可能只需要在某些情況下初始化資料庫用戶端。

context.Context

Go 的 context 套件定義了 Context 類型,這種類型可在不同 API 和程序之間傳遞期限、取消訊號和其他依要求劃定範圍的值。

如果 API 用戶端在特定函式叫用後仍存在,則應以通用 context.Context 值初始化,例如由 context.Background() 函式建立的值。如要最佳化效能,您可以在全域範圍內初始化用戶端。此用戶端及其內容可能會在指定函式執行個體的整個生命週期中留存。

函式叫用內容僅應用於落在特定函式叫用生命週期內的物件或作業。您的函式執行完畢後,叫用內容隨時可能會被取消,這表示任何使用此內容初始化的用戶端都可能遭關閉。函式叫用內容可以透過函式的引數存取:通常 HTTP 函式為 r.Context(),背景函式則為 ctx

如需使用 Cloud Pub/Sub 用戶端的範例,請參閱以下程式碼:


// Package contexttip is an example of how to use Pub/Sub and context.Context in
// a Cloud Function.
package contexttip

import (
	"context"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"os"

	"cloud.google.com/go/pubsub"
)

// projectID is set from the GCP_PROJECT environment variable, which is
// automatically set by the Cloud Functions runtime.
var projectID = os.Getenv("GCP_PROJECT")

// client is a global Pub/Sub client, initialized once per instance.
var client *pubsub.Client

func init() {
	// err is pre-declared to avoid shadowing client.
	var err error

	// client is initialized with context.Background() because it should
	// persist between function invocations.
	client, err = pubsub.NewClient(context.Background(), projectID)
	if err != nil {
		log.Fatalf("pubsub.NewClient: %v", err)
	}
}

type publishRequest struct {
	Topic string `json:"topic"`
}

// PublishMessage publishes a message to Pub/Sub. PublishMessage only works
// with topics that already exist.
func PublishMessage(w http.ResponseWriter, r *http.Request) {
	// Read the request body.
	data, err := ioutil.ReadAll(r.Body)
	if err != nil {
		log.Printf("ioutil.ReadAll: %v", err)
		http.Error(w, "Error reading request", http.StatusBadRequest)
		return
	}

	// Parse the request body to get the topic name.
	p := publishRequest{}
	if err := json.Unmarshal(data, &p); err != nil {
		log.Printf("json.Unmarshal: %v", err)
		http.Error(w, "Error parsing request", http.StatusBadRequest)
		return
	}

	m := &pubsub.Message{
		Data: []byte("Test message"),
	}
	// Publish and Get use r.Context() because they are only needed for this
	// function invocation. If this were a background function, they would use
	// the ctx passed as an argument.
	id, err := client.Topic(p.Topic).Publish(r.Context(), m).Get(r.Context())
	if err != nil {
		log.Printf("topic(%s).Publish.Get: %v", p.Topic, err)
		http.Error(w, "Error publishing message", http.StatusInternalServerError)
		return
	}
	fmt.Fprintf(w, "Published msg: %v", id)
}
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Functions Documentation