Go 執行階段

Cloud Functions Go 執行階段是以 Go 1.11.5 版為基礎。有關如何為 Go 開發預備本機電腦的說明,請參閱設定 Go 開發環境

若要開始使用 Go on Cloud Functions,請參閱快速入門

選取執行階段

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

gcloud

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

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

FLAGS... 指的是函式在第一次部署期間傳遞的引數。如需更多有關必要和選擇性引數的資訊,請參閱使用 gcloud 工具進行部署

主控台

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

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

    前往 Cloud Functions 總覽頁面

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

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

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

執行環境

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

Go 執行時使用以 Ubuntu 18.04 和 Go 1.11.5 版本為基礎的執行環境。請參閱 Cloud Functions 執行環境以取得更多資訊。

原始碼結構

為使 Cloud Functions 能夠找到您函式的定義,每個執行階段都對原始碼有一定的結構要求。請參閱寫入 Cloud Functions 以查看更多資訊。

指定依附元件

Go 中的 Cloud Functions 必須透過擁有 go.mod 檔案的 Go 模組或 vendor 目錄提供所有依附元件。如需更多資訊,請參閱在 Go 中指定依附元件

一次性初始化

您的函式可能需要進行一次性初始化,例如建立 API 用戶端和設定資料庫的存取。有多種方法可以做到這一點:

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

  • 使用 sync.Once.Do() 函式以在每一個 Cloud Functions 執行個體執行一次程式碼。若您只想按照需求進行初始化,而非首次啟動函式執行個體,這將非常實用。例如,您可能只需要在某些情況下初始化資料庫用戶端。

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