1. 定义
接口是自定义类型,是对是其他类型行为的抽象
type interfaceName interface{方法签名}// 变量声明后 类型为nil,值也为nil// 不能实例化(不能直接通过接口类型创建变量),只能由其他实现了接口的对象进行赋值// 实现接口:对象有(方法名,参数(数量,顺序,类型),返回值(数量,顺序,类型)匹配)所有接口中声明的所有方法
2. 声明
声明接口变量只需要定义变量类型为接口名,此时变量被初始化为 nil
package mainimport "fmt"type Sender interface {}func main() {var sender Senderfmt.Printf("%T,%v", sender, sender)}输出:<nil>,<nil>
3. 赋值
3.1 类型对象
当自定义类型实现了接口类型中声明的所有函数时,则该类型的对象可以赋值给接口变量, 并使用接口变量调用实现的接口
a) 方法接收者全为值类型的方法
package mainimport "fmt"type Sender interface {Send(to, msg string) errorSendAll(tos []string, msg string) error}// EmailSender 定义EmailSender结构体type EmailSender struct {addr stringport intuser, password string}//func NewEmailSender(addr string, port int, user, password string) EmailSender {// return EmailSender{addr, port, user, password}//}// Send 接收者为值对象func (sender EmailSender) Send(to, msg string) error {fmt.Printf("发送邮件给:%s,内容:%s\n", to, msg)return nil}// SendAll 接收者为值对象func (sender EmailSender) SendAll(tos []string, msg string) error {for _, to := range tos {fmt.Printf("发送邮件给:%s,内容:%s\n", to, msg)}return nil}func main() {var sender Sender = EmailSender{"smtp.qq.com", 22, "dadong", "123456"}fmt.Printf("%T:%v\n", sender, sender)sender.Send("Mr_dadong@163.com", "Hello Dadong")sender.SendAll([]string{"Mr_dadong@163.com", "596045361@qq.com"}, "早上好")}输出:main.EmailSender:{smtp.qq.com 22 dadong 123456}发送邮件给:Mr_dadong@163.com,内容:Hello Dadong发送邮件给:Mr_dadong@163.com,内容:早上好发送邮件给:596045361@qq.com,内容:早上好
