接口的定义与实现
一个变量如果实现了接口规定的所有的方法,那么这个变量就实现了这个接口,可以称为这个接口类型的变量
把接口当作变量使用
type 接口名称 interface{
方法函数名()
}
//var一个变量
var ss specker
变量名 = 参数
fmt.Println(变量名)
例
package main
import "fmt"
type dog struct{}
type person struct {
}
type cat struct{}
type specker interface {
speck() //实习了speak方法的变量都是specker类型
}
func (d dog) speck() {
fmt.Println("汪汪汪")
}
func (c cat) speck() {
fmt.Println("喵喵喵")
}
func (p person) speck() {
fmt.Println("呜呜呜")
}
func da(x specker) {
//接受一个参数,传进来什么,我就打什么
x.speck() //挨打了就要叫
}
func main() {
p1 := person{}
d1 := dog{}
c1 := cat{}
da(p1)
da(d1)
da(c1)
// 此处定义了一个specker接口类型的变量ss
var ss specker
// ss复制p1
ss = p1
fmt.Println(ss)
}
go语言是面向接口类型的编程语言,对于接口后面是通过面向对象还是面向过程实现的无所谓,只要能实现方法即可,都统一通过接口进行调用
接口传参
例题
package main
import "fmt"
type animal interface {
move()
eat(string)
}
type cat struct {
name string
foot int8
}
type dog struct {
name string
foot int8
}
func (c cat) move() {
fmt.Printf("%v在移动\n", c.name)
}
func (c cat) eat(e string) {
fmt.Printf("%v在吃%v\n", c.name, e)
}
func (d dog) move() {
fmt.Printf("%v在移动\n", d.name)
}
func (d dog) eat(e string) {
fmt.Printf("%v在吃%v\n", d.name, e)
}
func main() {
c1 := cat{
name: "淘淘",
foot: 4,
}
d1 := dog{
name: "大黑",
foot: 4,
}
var aa animal
aa = c1
fmt.Println(aa)
// {淘淘 4}
aa.eat("鱼")
aa.move()
aa = d1
fmt.Println(aa)
// {大黑 4}
aa.eat("骨头")
aa.move()
}
指针接受接口和值接受接口的区别
使用指针传递数据要使用指针接受
package main
import "fmt"
type animal interface {
move()
eat(string)
}
type cat struct {
name string
foot int8
}
type dog struct {
name string
foot int8
}
func (c *cat) move() {
fmt.Printf("%v在移动\n", c.name)
}
func (c *cat) eat(e string) {
fmt.Printf("%v在吃%v\n", c.name, e)
}
func (d *dog) move() {
fmt.Printf("%v在移动\n", d.name)
}
func (d *dog) eat(e string) {
fmt.Printf("%v在吃%v\n", d.name, e)
}
func main() {
c1 := cat{
name: "淘淘",
foot: 4,
}
d1 := dog{
name: "大黑",
foot: 4,
}
var aa animal
aa = &c1
fmt.Println(aa)
// {淘淘 4}
aa.eat("鱼")
aa.move()
aa = &d1
fmt.Println(aa)
// {大黑 4}
aa.eat("骨头")
aa.move()
}
对象的方法使用指针接受值后面调动接口也要使用指针接受值

浙公网安备 33010602011771号