我有以下代码:
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()
类型的变量。
答案 0 :(得分:0)
这是抽象的:
HealthFunction: vault.Client.GetHealth,
如果我们打电话给HealthFunction()
,您希望运行什么代码? vault.Client.GetHealth
只是承诺存在这样的功能;它不是一个功能本身。 Client
只是一个界面。
您需要创建符合Client
的内容并传递 GetHealth
。例如,如果您有一个现有的DefaultClient
,例如:
defaultClient := DefaultClient{}
然后你可以传递它的功能:
HealthFunction: defaultClient.GetHealth,
现在,当您稍后致电HealthFunction()
时,它将与调用defaultClient.GetHealth()
相同。
答案 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中的接口可用于根据类型满足的方法为类型组合常见的预期行为。
希望这有帮助。