1. 定义

接口是自定义类型,是对是其他类型行为的抽象

  1. type interfaceName interface{
  2. 方法签名
  3. }
  4. // 变量声明后 类型为nil,值也为nil
  5. // 不能实例化(不能直接通过接口类型创建变量),只能由其他实现了接口的对象进行赋值
  6. // 实现接口:对象有(方法名,参数(数量,顺序,类型),返回值(数量,顺序,类型)匹配)所有接口中声明的所有方法

2. 声明

声明接口变量只需要定义变量类型为接口名,此时变量被初始化为 nil

  1. package main
  2. import "fmt"
  3. type Sender interface {
  4. }
  5. func main() {
  6. var sender Sender
  7. fmt.Printf("%T,%v", sender, sender)
  8. }
  9. 输出:
  10. <nil>,<nil>

3. 赋值

3.1 类型对象

当自定义类型实现了接口类型中声明的所有函数时,则该类型的对象可以赋值给接口变量, 并使用接口变量调用实现的接口

a) 方法接收者全为值类型的方法

  1. package main
  2. import "fmt"
  3. type Sender interface {
  4. Send(to, msg string) error
  5. SendAll(tos []string, msg string) error
  6. }
  7. // EmailSender 定义EmailSender结构体
  8. type EmailSender struct {
  9. addr string
  10. port int
  11. user, password string
  12. }
  13. //func NewEmailSender(addr string, port int, user, password string) EmailSender {
  14. // return EmailSender{addr, port, user, password}
  15. //}
  16. // Send 接收者为值对象
  17. func (sender EmailSender) Send(to, msg string) error {
  18. fmt.Printf("发送邮件给:%s,内容:%s\n", to, msg)
  19. return nil
  20. }
  21. // SendAll 接收者为值对象
  22. func (sender EmailSender) SendAll(tos []string, msg string) error {
  23. for _, to := range tos {
  24. fmt.Printf("发送邮件给:%s,内容:%s\n", to, msg)
  25. }
  26. return nil
  27. }
  28. func main() {
  29. var sender Sender = EmailSender{"smtp.qq.com", 22, "dadong", "123456"}
  30. fmt.Printf("%T:%v\n", sender, sender)
  31. sender.Send("Mr_dadong@163.com", "Hello Dadong")
  32. sender.SendAll([]string{"Mr_dadong@163.com", "596045361@qq.com"}, "早上好")
  33. }
  34. 输出:
  35. main.EmailSender:{smtp.qq.com 22 dadong 123456}
  36. 发送邮件给:Mr_dadong@163.com,内容:Hello Dadong
  37. 发送邮件给:Mr_dadong@163.com,内容:早上好
  38. 发送邮件给:596045361@qq.com,内容:早上好

b) 方法接收者全为指针类型的