זמן הריצה של Go

סקירה כללית

הפונקציה של Cloud Run פועלת בסביבה שכוללת גרסת מערכת הפעלה, חבילות של תוספים, תמיכה בשפה וספריית Functions Framework שתומכת בפונקציה ומפעילה אותה. הסביבה הזו מזוהה לפי גרסת השפה, והיא נקראת זמן ריצה.

מידע על סביבות ריצה באופן כללי, ועל גרסת Ubuntu שבה כל סביבת ריצה של Go משתמשת, זמין במאמר סביבת ההפעלה של פונקציות Cloud Run.

בחירת זמן הריצה

פונקציות Cloud Run תומכות בכמה גרסאות של Go, שמפורטות בדף תמיכה בזמן ריצה. במהלך הפריסה, אפשר לבחור את זמן הריצה המועדף של Go לפונקציה.

אם אתם משתמשים ב-Google Cloud CLI, אתם יכולים לציין את סביבת זמן הריצה באמצעות הפרמטר --runtime עם סביבת זמן הריצה של Go שתבחרו. לדוגמה:

gcloud functions deploy FUNCTION_NAME --no-gen2 --runtime go121 FLAGS...

FLAGS... מתייחס לארגומנטים שמועברים במהלך הפריסה הראשונה של הפונקציה. מידע נוסף על ארגומנטים נדרשים ואופציונליים זמין במאמר פריסת פונקציה ב-Cloud Run.

הכנת הפונקציה

אתם יכולים לכתוב פונקציה במחשב המקומי ולהעלות אותה. כדי להכין את המחשב המקומי לפיתוח ב-Go, אפשר לעיין במאמר הגדרת סביבת פיתוח ב-Go.

כדי להתחיל במהירות להשתמש ב-Go בפונקציות Cloud Run, אפשר לעיין במדריך למתחילים.

מבנה קוד המקור

כדי שפונקציות Cloud Run יוכלו למצוא את ההגדרה של הפונקציה, קוד המקור צריך להיות בנוי במבנה מסוים. מידע נוסף זמין במאמר כתיבת פונקציות Cloud Run.

ציון יחסי תלות

פונקציות Cloud Run ב-Go צריכות לספק את כל התלות שלהן באמצעות מודולים של Go וקובץ go.mod, או באמצעות ספרייה vendor. מידע נוסף זמין במאמר בנושא Specifying dependencies in Go.

משתני סביבה

זמן הריצה של Go מגדיר באופן אוטומטי משתני סביבה מסוימים שהפונקציה יכולה להשתמש בהם לפי הצורך. פרטים נוספים זמינים במאמר בנושא שימוש במשתני סביבה.

Context type

חבילת context Go מגדירה את Context הסוג, שכולל מועדים, אותות ביטול וערכים אחרים בהיקף הבקשה, בין גבולות ה-API ובין תהליכים.

בדוגמה הבאה של קוד פונקציות Cloud Run אפשר לראות גישה להקשר על ידי לקוח 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
}