赛尔校园公共服务平台 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
赛尔校园公共服务平台 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 函数计算 FC 2.0
  4. 操作指南
  5. 代码开发
  6. Go
  7. 上下文

上下文

  • Go
  • 发布于 2025-04-16
  • 0 次阅读
文档编辑
文档编辑

本文介绍在函数计算中使用Go运行时开发代码时,所涉及的Context(上下文)的相关概念和使用示例。

什么是上下文

当函数计算运行您的函数时,它会将上下文对象(context.Context)传递到执行方法中。该对象包含有关调用、服务、函数、链路追踪和执行环境等信息。

事件请求处理程序(Event Handler)和HTTP请求处理程序(HTTP Handler)都支持上下文对象作为传入参数,且格式和内容相同。上下文对象主要提供了以下参数。
表 1. Context信息
字段说明
变量
RequestID本次调用请求的唯一ID。您可以记录该ID,当函数调用出现问题时方便查询。
Credentials

函数计算服务通过扮演服务角色而获取的一组临时密钥,其有效时间是36小时。您可以在代码中使用Credentials去访问相应的服务例如OSS,这就避免了您把自己的AccessKey信息编码在函数代码里。详细信息,请参见授予函数计算访问其他云服务的权限。

Function当前调用的函数的一些基本信息,例如函数名、函数入口、函数内存和超时时间。
Service当前调用的函数所在的服务信息,包含服务名称、接入的日志服务SLS的Project和Logstore信息,以及服务的版本和别名信息。其中qualifier表示调用函数时指定的服务版本或别名,version_id表示实际调用的服务版本。
Region当前调用的函数所在地域ID,例如在华东2(上海)地域调用,则地域ID为cn-shanghai。详细信息,请参见服务接入地址。
AccountId函数所属的阿里云账号ID(主账号ID)。
方法
deadline返回函数执行的超时时间,格式为Unix时间戳,单位:毫秒。

完整的数据结构,请参见context.go。

使用示例

示例一:打印Context信息

首先,函数的handler需要包含context参数,函数计算会把Context信息中的变量信息插入到context的取值中。然后,需要import aliyun/fc-runtime-go-sdk/fccontext,通过fccontext.FromContext方法获取fccontext。

package main

import (
    "context"
    "encoding/json"
    "log"

    "github.com/aliyun/fc-runtime-go-sdk/fc"
    "github.com/aliyun/fc-runtime-go-sdk/fccontext"
)

func main() {
    fc.Start(echoContext)
}

func echoContext(ctx context.Context) (string, error) {
    fctx, _ := fccontext.FromContext(ctx)
    log.Println(fctx.AccountId)
    log.Printf("%#v\n", fctx)
    res, _ := json.Marshal(fctx)
    return string(res), nil
}

示例二:获取函数剩余执行时间

以下示例展示了如何使用deadline获取函数剩余执行时间。

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "github.com/aliyun/fc-runtime-go-sdk/fc"
)

func LongRunningHandler(ctx context.Context) (string, error) {
    deadline, _ := ctx.Deadline()
    fmt.Printf("now: %s\ndeadline: %s\n", time.Now().String(), deadline.String())
    deadline = deadline.Add(-100 * time.Millisecond)
    timeoutChannel := time.After(time.Until(deadline))

    for {
        select {
        case <-timeoutChannel:
            return "Finished before timing out.", nil
        default:
            log.Print("hello!")
            time.Sleep(50 * time.Millisecond)
        }
    }
}

func main() {
    fc.Start(LongRunningHandler)
}
相关文章

环境说明 2025-04-16 14:22

本文介绍在函数计算中使用Go语言编写函数的运行环境信息。 Go运行时

请求处理程序(Handler) 2025-04-16 14:22

本文介绍在函数计算FC(Function Compute)中使用Go运行时开发请求处理程序的相关概念和方法。 什么是请求处理程序</

事件请求处理程序(Event Handler) 2025-04-16 14:22

本文介绍Go事件请求处理程序的结构和特点。 使用示例 在Go语言的代码中,您需要引入官方的SDK库

HTTP请求处理程序(HTTP Handler) 2025-04-16 14:22

您可以使用HTTP Handler更方便地处理HTTP请求。当调用函数时,FC运行您提供的执行方法来处理请求。本文介绍Go HTTP Handler的结构和特点。

上下文 2025-04-16 14:22

本文介绍在函数计算中使用Go运行时开发代码时,所涉及的Context(上下文)的相关概念和使用示例。 什么是上下文</

编译部署代码包 2025-04-16 14:22

Go是静态编译型语言,您需在本地自行编译程序并打包为.zip文件。本文介绍如何将函数计算官方Go SDK库与您的代码一同打包。 前提条件

目录
Copyright © 2025 your company All Rights Reserved. Powered by 赛尔网络.
京ICP备14022346号-15
gongan beian 京公网安备11010802041014号