Golang中的结构概念需要帮助

时间:2019-06-17 21:27:12

标签: go

我想在NewNotifier函数中使用slacknotificationprovider。我该怎么做。我也想在newNotifier函数中发送一个字符串(config.Cfg.SlackWebHookURL)。我该怎么办?还请向我建议一些材料,以更深入地了解golang中的结构和接口。 我还想知道为什么未定义ProviderType.Slack,因为我在SlackNotificationProvider类型的ProviderType结构中提到了它?谢谢。

type SlackNotificationProvider struct {
    SlackWebHookURL string
    PostPayload     PostPayload
}
type ProviderType struct {
    Slack   SlackNotificationProvider
    Discord DiscordNotificationProvider
}
type Notifier interface {
    SendNotification() error
}
func NewNotifier(providerType ProviderType) Notifier {
    if providerType == ProviderType.Slack {
        return SlackNotificationProvider{
            SlackWebHookURL: SlackWebHookURL,
        }
    } else if providerType == ProviderType.Discord {
        return DiscordNotificationProvider{
            DiscordWebHookURL: SlackWebHookURL + "/slack",
        }
    }
    return nil
}
slackNotifier := NewNotifier(config.Cfg.SlackWebHookURL)

错误: 1.不能在NewNotifiergo的参数中使用config.Cfg.SlackWebHookURL(类型字符串)作为ProviderType类型 2. ProviderType.Slack未定义(类型ProviderType没有方法Slack)去

1 个答案:

答案 0 :(得分:0)

Golang是一种强类型语言,这意味着函数的参数已定义且不能不同。字符串是字符串,只有字符串,struct是结构,只有结构。接口是golang的一种说法:“这可以是具有以下签名的方法的任何结构”。因此,您不能将string作为ProviderType传递,并且您的结构均未实际实现您定义的接口方法,因此,按照您的布局进行操作将无效。重新整理可能有用的内容:

const (
    discordType = "discord"
    slackType = "slack"
)

// This means this will match any struct that defines a method of 
// SendNotification that takes no arguments and returns an error
type Notifier interface {
    SendNotification() error
}

type SlackNotificationProvider struct {
    WebHookURL string
}

// Adding this method means that it now matches the Notifier interface
func (s *SlackNotificationProvider) SendNotification() error {
    // Do the work for slack here
}

type DiscordNotificationProvider struct {
   WebHookURL string
}

// Adding this method means that it now matches the Notifier interface
func (s *DiscordNotificationProvider) SendNotification() error {
    // Do the work for discord here
}

func NewNotifier(uri, typ string) Notifier {
    switch typ {
    case slackType:
       return SlackNotificationProvider{
            WebHookURL: uri,
        }
    case discordType:
        return DiscordNotificationProvider{
            WebHookURL: uri + "/slack",
        }
    }
    return nil
}
// you'll need some way to figure out what type this is
// could be a parser or something, or you could just pass it
uri := config.Cfg.SlackWebHookURL
typ := getTypeOfWebhook(uri)
slackNotifier := NewNotifier(uri, typ)

就帮助解决这个问题的文档而言,“按示例进行”是不错的选择,我看到其他人已经将其链接了。也就是说,具有一个方法的结构感觉它应该是一个函数,您也可以将其定义为一种类型,以允许您传递一些东西。示例:

type Foo func(string) string

func printer(f Foo, s string) {
    fmt.Println(f(s))
}

func fnUpper(s string) string {
    return strings.ToUpper(s)
}

func fnLower(s string) string {
    return strings.ToLower(s)
}

func main() {
   printer(fnUpper, "foo")
   printer(fnLower, "BAR")
}