在golang中将一个函数转换为另一个函数

时间:2017-10-23 15:53:02

标签: go

我有以下代码:

Parallel.For()

现在,我想将此函数用作此结构的一部分:

package vault

type Client interface {
    GetHealth() error
}

func (c DefaultClient)  GetHealth () error {
    resp := &VaultHealthResponse{}
    err := c.get(resp, "/v1/sys/health")
    if err != nil {
        return err
    }
    return nil;
}

基本上,将HealthFunction的值设置为GetHealth。现在,当我执行以下操作时:

type DependencyHealthFunction func() error

type Dependency struct {
    Name           string `json:"name"`
    Required       bool   `json:"required"`
    Healthy        bool   `json:"healthy"`
    Error          error  `json:"error,omitempty"`
    HealthFunction DependencyHealthFunction
}

这给了我一个错误,它说func (config *Config) GetDependencies() *health.Dependency { vaultDependency := health.Dependency{ Name: "Vault", Required: true, Healthy: true, HealthFunction: vault.Client.GetHealth, } temp1 := &vaultDependency return temp1; } 。我怎样才能做到这一点?

编辑:如何使用DependencyHealthFunction?

作为Dependency结构的一部分,它只是用作以下内容:cannot use vault.Client.GetHealth (type func(vault.Client) error) as type health.DependencyHealthFunction in field value其中d是d.HealthFunction()类型的变量。

2 个答案:

答案 0 :(得分:0)

这是抽象的:

    HealthFunction: vault.Client.GetHealth,

如果我们打电话给HealthFunction(),您希望运行什么代码? vault.Client.GetHealth只是承诺存在这样的功能;它不是一个功能本身。 Client只是一个界面。

您需要创建符合Client的内容并传递 GetHealth。例如,如果您有一个现有的DefaultClient,例如:

defaultClient := DefaultClient{}

然后你可以传递它的功能:

    HealthFunction: defaultClient.GetHealth,

现在,当您稍后致电HealthFunction()时,它将与调用defaultClient.GetHealth()相同。

https://play.golang.org/p/9Lw7uc0GaE

答案 1 :(得分:0)

我认为这个问题与理解如何在Go中处理接口有关。

接口只是定义一个特定类型必须满足的方法或方法集,才能被视为“实现”接口。

例如:

import "fmt"

type Greeter interface {
    SayHello() string
}

type EnglishGreeter struct{}

// Satisfaction of SayHello method
func (eg *EnglishGreeter) SayHello() string {
    return "Hello"
}

type SpanishGreeter struct{}

func (sg *SpanishGreeter) SayHello() string {
    return "Ola"
}

func GreetPerson(g Greeter) {
    fmt.Println(g.SayHello())
}

func main() {
    eg := &EnglishGreeter{}

    sg := &SpanishGreeter{}

    // greet person in english
    GreetPerson(eg)

    // greet person in spanish
    GreetPerson(sg)
}

只需在结构中包含一个Greeter字段,就可以将此行为添加到自定义结构中。即

type FrontEntrance struct {
    EntranceGreeter Greeter
}

fe := &FrontEntrance { EntranceGreeter: &EnglishGreeter{} }

// then call the SayHello() method like this
fe.EntranceGreeter.SayHello()

golang中的接口可用于根据类型满足的方法为类型组合常见的预期行为。

希望这有帮助。