Go语言程序:创建名为 Mailer 的接口,定义 Send 方法
本文将介绍如何创建一个名为 mailer 的接口,该接口使用接口嵌入和函数作为参数来定义 send 方法。Go 语言中的接口是定义一组行为的方法集合。
算法
创建一个 Mailer 接口,其中包含一个 Send 函数,该函数接受两个参数:收件人的电子邮件地址和电子邮件正文。如果发送过程中发生错误,Send 方法应返回错误。
示例 1
创建表示各种邮件发送程序实现的结构体,例如 SmtpMailer、SendGridMailer 等。
根据各自的邮件发送逻辑,为每个邮件发送程序结构体实现 Send 函数。
创建一个名为 MailerFacade 的新结构体,该结构体具有 Mailer 接口。
此类型用作多个邮件发送程序实现的容器。
在主程序中创建邮件发送程序实现的实例,并将其包装在 MailerFacade 实例中。
将 MailerFacade 实例保存在 Mailer 接口切片中。遍历切片,使用收件人的电子邮件地址和电子邮件正文作为参数,在每个邮件发送程序上调用 Send 方法。
示例 2
创建描述各种邮件发送或写入逻辑的函数,例如 SendSMTPMail、SendSendGridMail 等。
检查这些方法是否与 Mailer 接口的 Send 方法具有相同的签名。
在主程序中创建一个函数切片,每个函数都与 Send 方法具有相同的签名。
用反映各种邮件发送或写入逻辑的函数填充切片。
遍历切片,使用收件人的电子邮件地址和电子邮件正文作为参数调用每个函数。
示例 1
此示例允许接口嵌入其他接口,使嵌入的接口继承嵌入接口的所有方法。下面的代码定义了多个满足 mailer 接口的邮件发送程序实现。主函数创建邮件发送程序的实例,并用一个外观模式包装它们,该外观模式迭代一个 mailer 函数切片来发送邮件。
package main import "fmt" type Mailer interface { Send(string, string) error } type SmtpMailer struct{} func (s *SmtpMailer) Send(to, body string) error { fmt.Printf("Sending SMTP mail to: %s\nBody: %s\n", to, body) return nil } type SendGridMailer struct{} func (s *SendGridMailer) Send(to, body string) error { fmt.Printf("Sending SendGrid mail to: %s\nBody: %s\n", to, body) return nil } type FileMailer struct{} func (f *FileMailer) Send(to, body string) error { fmt.Printf("Writing mail to file for: %s\nBody: %s\n", to, body) return nil } type MailerFacade struct { Mailer } func main() { smtpMailer := &SmtpMailer{} sendGridMailer := &SendGridMailer{} fileMailer := &FileMailer{} smtpMailerFacade := MailerFacade{smtpMailer} sendGridMailerFacade := MailerFacade{sendGridMailer} fileMailerFacade := MailerFacade{fileMailer} mailers := []Mailer{&smtpMailerFacade, &sendGridMailerFacade, & fileMailerFacade} for _, mailer := range mailers { err := mailer.Send("[email protected]", "Hello, World!") if err != nil { fmt.Printf("Error sending mail: %v\n", err) } } }
输出
Sending SMTP mail to: [email protected] Body: Hello, World! Sending SendGrid mail to: [email protected] Body: Hello, World! Writing mail to file for: [email protected] Body: Hello, World!
示例 2
在此示例中,我们将使用 Go 语言中的函数切片来选择不同的邮件发送实现。通过此方法,我们可以轻松地在不同的邮件发送技术之间切换。下面的代码定义了表示不同邮件发送程序的多个函数,以及一个主函数,该函数迭代一个邮件发送程序函数切片并调用每个函数以将发送邮件写入文件。
package main import "fmt" type Mailer interface { Send(to, body string) error } func SendSMTPMail(to, body string) error { fmt.Printf("Sending SMTP mail to: %s\nBody: %s\n", to, body) return nil } func SendSendGridMail(to, body string) error { fmt.Printf("Sending SendGrid mail to: %s\nBody: %s\n", to, body) return nil } func WriteMailToFile(to, body string) error { fmt.Printf("Writing mail to file for: %s\nBody: %s\n", to, body) return nil } func main() { mailers := []func(string, string) error{ SendSMTPMail, SendSendGridMail, WriteMailToFile, } for _, mailer := range mailers { err := mailer("[email protected]", "Hello, World!") if err != nil { fmt.Printf("Error sending mail: %v\n", err) } } }
输出
Sending SMTP mail to: [email protected] Body: Hello, World! Sending SendGrid mail to: [email protected] Body: Hello, World! Writing mail to file for: [email protected] Body: Hello, World!
结论
本文讨论了如何使用接口创建一个名为 mailer 的接口,该接口定义了一个 send 方法,通过使用接口,我们为不同的邮件发送程序实现定义了一个公共契约。这里我们讨论了两种方法,包括嵌入接口和主方法。