go - 是否可以在运行时删除结构值的字段?

标签 go struct

我有以下结构:

type Record struct {
  Id     string   `json:"id"`
  ApiKey string   `json:"apiKey"`
  Body   []string `json:"body"`
  Type   string   `json:"type"`
}

这是 dynamoDB 表的蓝图。我需要以某种方式删除 ApiKey,用于检查用户是否有权访问给定记录。解释:

我的 API 中有端点,用户可以在其中发送 id 来获取项目,但他需要访问 ID 和 ApiKey(我使用的是 Id (uuid) + ApiKey) 来创建独特的项目。

我最近怎么样:

 func getExtraction(id string, apiKey string) (Record, error) {
    svc := dynamodb.New(cfg)

    req := svc.GetItemRequest(&dynamodb.GetItemInput{
      TableName: aws.String(awsEnv.Dynamo_Table),
      Key: map[string]dynamodb.AttributeValue{
        "id": {
          S: aws.String(id),
        },
      },
    })

    result, err := req.Send()
    if err != nil {
      return Record{}, err
    }

    record := Record{}
    err = dynamodbattribute.UnmarshalMap(result.Item, &record)
    if err != nil {
      return Record{}, err
    }

    if record.ApiKey != apiKey {
      return Record{}, fmt.Errorf("item %d not found", id)
    }
    // Delete ApiKey from record
    return record, nil
  }

在检查 ApiKey 是否等于提供的 apiKey 后,我想从 record 中删除 ApiKey,但不幸的是,这是不可能的使用 delete

谢谢。

最佳答案

无法在运行时实际编辑 golang 类型(例如结构)。不幸的是,您还没有真正解释您希望通过“删除”APIKey 字段实现什么。

一般方法是:

  1. 检查后将 APIKey 字段设置为空字符串,如果您不想在空字符串时显示此字段,请将 json 结构标记设置为 omitempty(例如 `json:"apiKey,omitempty"`)

  2. 将 APIKey 字段设置为 never Marshal into JSON(例如 ApiKey 字符串 `json:"-"`),您仍然可以检查它,只是不会显示在 JSON 中,您可以通过添加自定义编码/解码函数以单向或上下文相关的方式处理此问题

  3. 将数据复制到新结构,例如键入不带 APIKey 字段的 RecordNoAPI 结构,并在检查原始记录后返回该结构

关于go - 是否可以在运行时删除结构值的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49241317/

相关文章:

c - 当我们可以简单地做到这一点时,为什么要在创建链表时创建堆呢?

c# - 当 T 是结构时,List<T>.Find 如何工作?

sql - 如何显示查询结果计数

loops - 为什么无限循环不递增整数?

linux - 内核调度代码(linux)中的 struct rq 在哪里??/

c - 结构错误中的 union

c++ - 在文件输入过程中跟踪最高的 5 个数字

go - 如何使用 Goland 在远程机器上调试 go 代码?

go - 是否可以限制 Go 基准测试中的迭代次数 (b.N)?

interface - 检查值是否实现接口(interface)的说明