1. 定义
接口是自定义类型,是对是其他类型行为的抽象
type interfaceName interface{
方法签名
}
// 变量声明后 类型为nil,值也为nil
// 不能实例化(不能直接通过接口类型创建变量),只能由其他实现了接口的对象进行赋值
// 实现接口:对象有(方法名,参数(数量,顺序,类型),返回值(数量,顺序,类型)匹配)所有接口中声明的所有方法
2. 声明
声明接口变量只需要定义变量类型为接口名,此时变量被初始化为 nil
package main
import "fmt"
type Sender interface {
}
func main() {
var sender Sender
fmt.Printf("%T,%v", sender, sender)
}
输出:
<nil>,<nil>
3. 赋值
3.1 类型对象
当自定义类型实现了接口类型中声明的所有函数时,则该类型的对象可以赋值给接口变量, 并使用接口变量调用实现的接口
a) 方法接收者全为值类型的方法
package main
import "fmt"
type Sender interface {
Send(to, msg string) error
SendAll(tos []string, msg string) error
}
// EmailSender 定义EmailSender结构体
type EmailSender struct {
addr string
port int
user, 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,内容:早上好