gpt4 book ai didi

go - golang 中的结构概念需要帮助

转载 作者:数据小太阳 更新时间:2023-10-29 03:44:47 24 4
gpt4 key购买 nike

我想在 NewNotifier 函数中使用 slacknotificationprovider。我该怎么做。我还想在 newNotifier 函数中发送一个字符串(config.Cfg.SlackWebHookURL)。我应该怎么办?另外请给我一些 Material ,以更深入地了解 golang 中的结构和接口(interface)。我还想知道为什么 ProviderType.Slack 没有像我在 ProviderType 结构中提到的那样定义为 SlackNotificationProvider 类型?谢谢。

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)go

最佳答案

Golang 是一种强类型语言,这意味着您的函数的参数已定义且不能不同。字符串是字符串且仅是字符串,结构是结构且仅是结构。接口(interface)是 golang 表达“这可以是任何具有具有以下签名的方法的结构”的方式。所以你不能将 string 作为 ProviderType 传递,而且你的结构都没有真正实现你定义的接口(interface)方法,所以没有任何东西可以像你放置的那样工作出去。将你所拥有的东西重新组织成可能有用的东西:

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)

就帮助解决此问题的文档而言,“Go By Example”内容很好,我看到其他人已经将其链接。也就是说,具有一个方法的结构感觉它应该是一个函数,您也可以将其定义为一种类型以允许您传回一些东西。示例:

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")
}

关于go - golang 中的结构概念需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56639123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com