【golang笔记】go_接口interface(15)

Page content

这一篇简单的整理了golang接口interface相关的内容。

1.接口的基本结构

下面的例子可以简单的说明接口的基本结构

package main
 
import "fmt"
 
type Usb interface {
 Start()
 Stop()
}
type Phone struct {
 
}
type Camera struct {
 
}
type  Computer struct {
 
}
func (p Phone) Start()  {
 fmt.Println("链接手机...")
}
func (p Phone) Stop()  {
 fmt.Println("断开手机...")
}
func (c Camera) Start()  {
 fmt.Println("链接相机...")
}
func (c Camera) Stop()  {
 fmt.Println("断开相机...")
}
func (com Computer) Working(usb Usb)  {
 usb.Start()
 usb.Stop()
}
func main() {
 phone := Phone{}
 camera := Camera{}
 computer := Computer{}
 computer.Working(phone)
 computer.Working(camera)
}

执行结果

$ go run main.go
链接手机...
断开手机...
链接相机...
断开相机...

2.细节说明

1、接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)

package main

import (
 "fmt"
)

type E interface {
 Say()
}
type F struct {
 Name string
}

func (b F) Say() {
 fmt.Println("say()")
}

func main() {
 var b F
 var a E = b
 a.Say()
}

2、接口中所有的方法都没有方法体.即都是没有实现的方法。 3、在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。 4、一个自定义类型只能是实现了接口,才能将该类型的实例赋给接口。 5、只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型

package main

import "fmt"

type A interface {
 Say()
}
type B int

func (b B) Say() {
 fmt.Println("b=", b)
}
func main() {
 var i B = 10
 var a A = i
 a.Say()        //b= 10
 fmt.Println(a) //10
}

6、一个自定义类型可以实现多个接口

package main

import "fmt"

type A interface {
 Say()
}
type B interface {
 Hello()
}
type C struct {
}

func (c C) Say() {
 fmt.Println("A接口被实现")
}
func (c C) Hello() {
 fmt.Println("B接口被实现")
}
func main() {
 var c C
 var a A = c
 var b B = c
 a.Say()    //A接口被实现
 b.Hello()  //B接口被实现
}

7、接口中不能出现任何变量 8、-一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现。

package main

import "fmt"

type A interface {
 Say()
}
type B interface {
 Hello()
}
type D interface {
 A
 B
 Hei()
}
type C struct {
}

func (c C) Say() {
 fmt.Println("A接口被实现")
}
func (c C) Hello() {
 fmt.Println("B接口被实现")
}
func (c C) Hei() {
 fmt.Println("D接口被实现")
}

func main() {
 var c C
 var d D = c
 d.Hello()
 d.Say()
 d.Hei()
}

9、interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用那么会输出nil 10、空接口interface{}没有任何方法,所以所有类型都实现了空接口


欢迎大家的意见和交流

email: li_mingxie@163.com