【问题标题】:How to pass variadic functions into another function如何将可变参数函数传递给另一个函数
【发布时间】:2021-02-09 01:47:25
【问题描述】:

我正在与aws-sdk-v2 合作,我想使用“secretsmanager”服务制作一个最低限度的工作示例。

我正在尝试按照使用“kms”服务的类似example 中的步骤进行操作。

这是我的脚本:

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
    "github.com/aws/aws-sdk-go-v2/service/secretsmanager"
)

func main() {

    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
        log.Printf("error: %v", err)
        return
    }

    client := imds.NewFromConfig(cfg)

    region, err := client.GetRegion(context.TODO(), &imds.GetRegionInput{})
    if err != nil {
        log.Printf("Unable to retrieve the region from the EC2 instance %v\n", err)
    }

    fmt.Printf(region.Region)

    svc := secretsmanager.NewFromConfig(cfg)

    input := &secretsmanager.CreateSecretInput{Name: aws.String("test")}
    
    opts := &secretsmanager.Options{Region: region.Region}
    result, err := svc.CreateSecret(context.TODO(), input, opts)

    if err != nil {

        fmt.Println(err)
    }
    fmt.Println(result)

}

错误:

./main.go:38:46: cannot use opts (type *secretsmanager.Options) as type func(*secretsmanager.Options) in argument to svc.CreateSecret

所以错误显然在那些行中:

    opts := &secretsmanager.Options{Region: region.Region}
    result, err := svc.CreateSecret(context.TODO(), input, opts)

documentation 开始,函数 CreateSecret 采用以下输入类型:

func (c *Client) CreateSecret(ctx context.Context, params *CreateSecretInput, optFns ...func(*Options)) (*CreateSecretOutput, error)

我不知道如何在我的上下文中创建这个 ...func(*Options) 部分。有人可以帮我完成这部分吗?

【问题讨论】:

  • 寻找创建secretsmanager.Options的函数,不要自己传递选项
  • 它们通常以With... 开头。像secretsmanager.WithEndpointResolver 一样,基本上任何返回func(*Options) 类型的函数,例如func WithEndpointResolver(v EndpointResolver) func(*Options)
  • @TehSphinX 我无法让你举例。我停留在这一点secretsmanager.WithEndpointResolver(secretsmanager.EndpointResolver(secretsmanager.ResolveEndpoint())),不知道接下来我应该通过什么

标签: go aws-sdk-go


【解决方案1】:

我想通了:

    opts := func(o *secretsmanager.Options) {
        o.Region = region.Region
    }

    result, err := svc.CreateSecret(context.TODO(), input, opts)

【讨论】:

    猜你喜欢
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2020-10-03
    相关资源
    最近更新 更多