接口
接口是用来定义行为的类型。这些被定义的行为不由接口直接实现,而是通过方法由用户 定义的类型实现。如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定 义的类型的值就可以赋给这个接口类型的值
package main
import "fmt"
type notifier interface {
notify()
}
type student struct {
name string
email string
}
func main(){
stu1 := student{"cdb", "4717@qq.com"}
sendNotify(&stu1)
//sendNotify(stu1) //报错 stu1 没实现notify
teacher1 := teacher{"王老师", "wang@tch.com"}
sendNotify(&teacher1)
sendNotify(teacher1)
}
func (u *student) notify(){
fmt.Printf("通知 %s 邮件地址是 %s", u.name, u.email)
}
func sendNotify(n notifier){
n.notify()
}
//多态测试
type teacher struct {
name string
email string
}
//通知老师
func (u teacher) notify(){
fmt.Printf("通知 老师了~~~~~%s 邮件地址是 %s", u.name, u.email)
}
多态
多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接 口,所有使用这个接口的地方,都可以支持这种类型的值 ,teacher 类型用于实现多态
方法集
实体类型以指针接收者实现接口的时候,只有指向这个类型的指针才被认为实现了该接口
- 以方法接收者是值还是指针的角度看
methods receivers | values |
---|---|
t T | T 和 *T |
t *T | t *T |
- 从接收者类型的角度来看方法集
values | methods receivers |
---|---|
T | t T |
*T | t T 和 t *T |
公开或未公开的标识符
当一个标识符的名字以小写字母开头时,这个标识符就是未公开的,即包外的代码不可见。 如果一个标识符以大写字母开头,这个标识符就是公开的,即被包外的代码可见
package main
import (
"fmt"
"github.com/goinaction/code/chapter5/listing64/counters"
)
func main(){
//小写无法在包外访问
counter := counters.alertCounter(10) //报错 unexport alertCounter
fmt.Println(counter)
}