在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值。
下面将创建一个用户定义结构体并实现一个发送接口:package main import "fmt" // 定义一个notifier接口 // 通知类行为的一个接口 type notifier interface { notify() } // 定义一个用户类 type user struct { name string email string } // nofity是使用指针接收者实现的方法 func (u *user) notify() { fmt.Print("发送一条邮件给%s<%s>", u.name, u.email) } func main() { // 创建一个用户并复制 user := user{"小明", "1001**@qq.com"} sendNotification(&user) } func sendNotification(n notifier) { n.notify() } 注意:这里传递给sendNotification方法的用户定义结构体值user,是使用引用的方式传递的。因为类在实现接口的时候传递的参数是引用类型:(u *user),如果你是使用值传递的话,编辑器会报错。./demo.go:25:18: cannot use user (type user) as type notifier in argument to sendNotification: user does not implement notifier (notify method has pointer receiver)
进一步探索新问题,为什么上述使用值不行,使用引用可以呢?如果你把是实现接口的传递参数改成值的形式而不是引用,你将会发现有所不同// nofity是使用指针接收者实现的方法 func (u user) notify() { fmt.Print("发送一条邮件给%s<%s>", u.name, u.email) } // 创建一个用户并复制 你将会发现,使用引用的方式调用跟使用值的方式调用,编译器都不会报错,这是为什么?
注意:使用指针实现接口和使用值实现接口有个区别在于,指针是指向内存同一块地址的,所以通过指针传递的参数,在函数体内执行结构体的改变会影响函数外的用户类型值,而使用值传递则不会 ,这也是在使用指针和使用值的不同场景选择的一个区别其中之一。使用值: package main import "fmt" // 定义一个notifier接口 // 通知类行为的一个接口 type notifier interface { notify() } // 定义一个用户类 type user struct { name string email string } // nofity是使用指针接收者实现的方法 func (u user) notify() { u.name = "小红" fmt.Print("发送一条邮件给%s<%s>", u.name, u.email) } func main() { // 创建一个用户并复制 user := user{"小明", "1001**@qq.com"} //sendNotification(user) sendNotification(&user) // 小明 fmt.Println(user.name) sendNotification(user) // 小明 fmt.Println(user.name) } func sendNotification(n notifier) { n.notify() } 使用指针: package main import "fmt" // 定义一个notifier接口 // 通知类行为的一个接口 type notifier interface { notify() } // 定义一个用户类 type user struct { name string email string } // nofity是使用指针接收者实现的方法 func (u *user) notify() { u.name = "小红" fmt.Print("发送一条邮件给%s<%s>", u.name, u.email) } func main() { // 创建一个用户并复制 user := user{"小明", "1001**@qq.com"} //sendNotification(user) sendNotification(&user) // 小红 fmt.Println(user.name) } func sendNotification(n notifier) { n.notify() }
|
请发表评论