
# Go函数开发概述
#### Go函数接口定义
FunctionGraph运行时支持Go 1.x版本，函数有明确的接口定义，如下所示：
```
func Handler (payload []byte, ctx context.RuntimeContext)
```
- 入口函数名（Handler）：入口函数名称。
- 执行事件体（payload）： 函数执行界面由用户输入的执行事件参数， 格式为JSON对象。
- 上下文环境（ctx）：Runtime提供的函数执行上下文，其接口定义在[SDK接口]说明。
Go函数的函数执行入口参数格式为：与代码包中的可执行文件名保持一致。编译后的动态库文件名称必须与函数执行入口的插件名称保持一致，例如：动态库名称为testplugin.so，则函数执行入口命名为testplugin.Handler。可通过FunctionGraph控制台进入函数详情页的常规设置中进行配置或修改。
 #### SDK接口
FunctionGraph函数GoSDK提供了Event事件接口、Context接口和日志记录接口。[Go SDK下载](https://function-community.obs.cn-north-1.myhuaweicloud.com/sdk/functiongraph-go-runtime-sdk-1.0.1.zip)（[Go SDK下载.sha256](https://functionstage-examples.obs.cn-north-1.myhuaweicloud.com/public-material-sha256/functiongraph-go-runtime-sdk-1.0.1.zip.sha256)）。
- Event事件接口 Go SDK加入了触发器事件结构体定义，目前支持CTS、KAFKA、DIS、DDS、SMN、LTS、TIMER、APIG、触发器。在需要使用触发器的场景时，编写相关代码更简单。
  1. **APIG触发器相关字段说明**
     1. APIGTriggerEvent相关字段说明
        表1APIGTriggerEvent相关字段说明 
        | 字段名                   | 字段描述                                                                           |
        |:---|:---|
        | IsBase64Encoded       | Event中的body是否是base64编码                                                         |
        | HttpMethod            | HTTP请求方法                                                                       |
        | Path                  | HTTP请求路径                                                                       |
        | Body                  | HTTP请求body                                                                     |
        | PathParameters        | 所有路径参数                                                                         |
        | RequestContext        | 相关的APIG配置（[APIGRequestContext对象]） |
        | Headers               | HTTP请求头                                                                        |
        | QueryStringParameters | 查询参数                                                                           |
        | UserData              | APIG自定义认证中设置的userdata                                                          |
           
         表2APIGRequestContext相关字段说明 
        | 字段名       | 字段描述              |
        |:---|:---|
        | ApiId     | API的ID            |
        | RequestId | 此次API请求的requestId |
        | Stage     | 发布环境名称            |
           
        
     
     2. APIGTriggerResponse相关字段说明
        表3APIGTriggerResponse相关字段说明 
        | 字段名             | 字段描述                    |
        |:---|:---|
        | Body            | 消息体                     |
        | Headers         | 最终返回的HTTP响应头            |
        | StatusCode      | HTTP状态码，int类型           |
        | IsBase64Encoded | body是否经过base64编码，bool类型 |
           
        ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
        APIGTriggerEvent提供GetRawBody()方法获取base64解码后的body体，相应的APIGTriggerResponse提供SetBase64EncodedBody()方法来设置base64编码的body体。
        
      
  
  2. **DIS触发器相关字段说明**
     表4DISTriggerEvent相关字段说明 
     | 字段名        | 字段描述                                                               |
     |:---|:---|
     | ShardID    | 分区ID                                                               |
     | Message    | DIS消息体（[DISMessage结构]） |
     | Tag        | 函数版本                                                               |
     | StreamName | 通道名称                                                               |
        
      表5DISMessage相关字段说明 
     | 字段名                 | 字段描述                                                             |
     |:---|:---|
     | NextPartitionCursor | 下一个游标                                                            |
     | Records             | 消息记录（[DISRecord结构]） |
     | MillisBehindLatest  | 保留字段                                                             |
        
      表6DISRecord相关字段说明 
     | 字段名            | 字段描述           |
     |:---|:---|
     | PartitionKey   | 数据分区           |
     | Data           | 数据             |
     | SequenceNumber | 序列号（每个记录的唯一标识） |
        
     
  
  3. **KAFKA触发器相关字段说明**
     表7KAFKATriggerEvent相关字段说明 
     | 字段名          | 字段描述                                                   |
     |:---|:---|
     | InstanceId   | 实例ID                                                   |
     | Records      | 消息记录（[表8]） |
     | TriggerType  | 触发器类型，返回KAFKA                                          |
     | Region       | region                                                 |
     | EventTime    | 事件发生时间，秒数                                              |
     | EventVersion | 事件版本                                                   |
        
      表8KAFKARecord相关字段说明 
     | 字段名      | 字段描述     |
     |:---|:---|
     | Messages | DMS消息体   |
     | TopicId  | DMS的主题ID |
        
     
  
  4. **SMN触发器相关字段说明**
     表9SMNTriggerEvent相关字段说明 
     | 字段名    | 字段描述                                                             |
     |:---|:---|
     | Record | 消息记录集合（[SMNRecord结构]） |
        
      表10SMNRecord相关字段说明 
     | 字段名                  | 字段描述                                                             |
     |:---|:---|
     | EventVersion         | 事件版本（当前为1.0）                                                     |
     | EventSubscriptionUrn | 订阅URN                                                            |
     | EventSource          | 事件源                                                              |
     | Smn                  | SMN事件消息体（[SMNBody结构]） |
        
      表11SMNBody相关字段说明 
     | 字段名               | 字段描述     |
     |:---|:---|
     | TopicUrn          | SMN主题URN |
     | TimeStamp         | 消息时间戳    |
     | MessageAtrributes | 消息属性集合   |
     | Message           | 消息体      |
     | Type              | 消息类型     |
     | MessageId         | 消息ID     |
     | Subject           | 消息主题     |
        
     
  
  5. **定时触发器相关字段说明**
     表12TimerTriggerEvent相关字段说明 
     | 字段名         | 字段描述            |
     |:---|:---|
     | Version     | 版本名称（当前为"v1.0"） |
     | Time        | 当前时间            |
     | TriggerType | 触发器类型（"Timer"）  |
     | TriggerName | 触发器名称           |
     | UserEvent   | 触发器附加信息         |
        
     
  
  6. **LTS触发器相关字段说明**
     表13LTSTriggerEvent相关字段说明 
     | 字段名 | 字段描述                                                          |
     |:---|:---|
     | Lts | LTS消息（[LTSBody结构]） |
        
      表14**LTSBody相关字段说明** 
     | 字段名  | 字段描述    |
     |:---|:---|
     | Data | LTS原始消息 |
        
     ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
     **LTSBody**提供GetRawData()函数返回base64解码后的消息。
     
  
  7. **CTS触发器相关字段说明**
     表15CTSTriggerEvent字段说明 
     | 字段名 | 字段说明                                                        |
     |:---|:---|
     | CTS | CTS消息体（[表16]） |
        
      表16CTS结构相关字段说明 
     | 字段名          | 字段描述                                                          |
     |:---|:---|
     | Time         | 事件产生时间                                                        |
     | User         | 触发该事件的用户信息（[表17]） |
     | Request      | 事件请求内容                                                        |
     | Response     | 事件响应内容                                                        |
     | Code         | 响应码                                                           |
     | ServiceType  | 事件触发的服务名称                                                     |
     | ResourceType | 事件触发的资源类型                                                     |
     | ResourceName | 事件触发的资源名称                                                     |
     | ResourceId   | 事件触发资源的唯一标识                                                   |
     | TraceName    | 事件名称                                                          |
     | TraceType    | 事件触发的方式（如ConsoleAction：代表前台操作）                                |
     | RecordTime   | CTS服务接收事件时间                                                   |
     | TraceId      | 当前事件的唯一标识                                                     |
     | TraceStatus  | 事件状态                                                          |
        
      表17User字段说明 
     | 字段名    | 字段描述                                                   |
     |:---|:---|
     | Name   | 用户名（同一账号可以创建多个子用户）                                     |
     | Id     | 用户ID                                                   |
     | Domain | 账号信息（[表18]） |
        
      表18Domain字段说明 
     | 字段名  | 字段描述 |
     |:---|:---|
     | Name | 账号名称 |
     | Id   | 账号ID |
        
     
  
  
  ![](https://support.huaweicloud.com/devg-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
  1. 例如使用APIG触发器时，只需要把入口函数（假如函数名为handler）的第一个参数按照如下方式设置：handler(APIGTriggerEvent event, Context context)。**相关约束条件请参考** **[Base64解码和返回结构体的说明](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0102.html#functiongraph_02_0102__li176282148442)** **。**
  
  2. 关于所有TriggerEvent，上面提到的TriggerEvent方法均有与之对应的set方法，建议在本地调试时使用；DIS和LTS均有对应的getRawData()方法，但无与之相应的setRawData()方法。
    
- Context接口 Context接口提供函数获取函数执行上下文，例如，用户委托的AccessKey/SecretKey、当前请求ID、函数执行分配的内存空间、CPU数等。
  Context接口说明如[表19]所示。
   表19Context类上下文方法说明 
  | 方法名                                                       | 方法说明                                                                                                                                                     |
  |:---|:---|
  | getRequestID( )                                           | 获取请求ID。                                                                                                                                                  |
  | getRemainingTimeInMilligetRunningTimeInSecondsSeconds ( ) | 获取函数剩余运行时间。                                                                                                                                              |
  | getAccessKey( )                                           | 获取用户委托的AccessKey（有效期24小时），使用该方法需要为函数配置委托。 **当前函数工作流已停止维护Runtime SDK 中getAccessKey接口，您将无法使用getAccessKey获取临时AK。** |
  | getSecretKey( )                                           | 获取用户委托的SecretKey（有效期24小时），使用该方法需要为函数配置委托。 **当前函数工作流已停止维护Runtime SDK 中getSecretKey接口，您将无法使用getSecretKey获取临时SK。** |
  | getSecurityAccessKey( )                                   | 获取用户委托的SecurityAccessKey（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                            |
  | getSecuritySecretKey( )                                   | 获取用户委托的SecuritySecretKey（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                            |
  | getSecurityToken( )                                       | 获取用户委托的SecurityToken（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                                |
  | getUserData(string key)                                   | 通过key获取用户通过环境变量传入的值。                                                                                                                                     |
  | getFunctionName( )                                        | 获取函数名称。                                                                                                                                                  |
  | getRunningTimeInSeconds ( )                               | 获取函数超时时间。                                                                                                                                                |
  | getVersion( )                                             | 获取函数的版本。                                                                                                                                                 |
  | getMemorySize( )                                          | 分配的内存。                                                                                                                                                   |
  | getCPUNumber( )                                           | 获取函数占用的CPU资源。                                                                                                                                            |
  | getPackage( )                                             | 获取函数组。                                                                                                                                                   |
  | getToken( )                                               | 获取用户委托的token（有效期24小时），使用该方法需要为函数配置委托。                                                                                                                    |
  | getLogger( )                                              | 获取context提供的logger方法（默认会输出时间、请求ID等信息）。                                                                                                                   |
  | getAlias()                                                | 获取函数的别名                                                                                                                                                  |
     
  
- 日志接口Go SDK日志接口日志说明如[表20]所示。
   表20日志接口说明表 
  | 方法名             | 方法说明                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
  |:---|:---|
  | RuntimeLogger() | - 记录用户输入日志对象，包含方法如下：Logf(format string, args ...interface{})    - 该方法会将内容输出到标准输出，格式："时间-请求ID-输出内容"，示例如下：2017-10-25T09:10:03.328Z 473d369d-101a-445e-a7a8-315cca788f86 test log output。   |
     
  
 
