GoLang:接口

学习自:Go教程119页

1、说明

接口是为了定义某些标准,接口本身不需要实现这些标准

2、定义

接口中不能有任何数据字段,只能有函数声明

type 接口名称 interface{
    函数声明
}

 

接口中嵌入另一个接口

但是嵌入的接口中方法不能重名,把自己嵌入自己

3、例子

1)常规用法

定义一个接口

type usber interface{
    start()
    stop()
}

定义两个将要使用该接口的结构体

type Computer struct{
    name string
    model string
}
type Phone struct{
    name string
    model string
}

实现接口方法(和实现正常方法的写法相同,区别在于要为每种结构体各写一遍)

//为Computer实现接口方法
func (cm Computer)start(){
    fmt.Println("启动电脑")
}
func (cm Computer)stop(){
    fmt.Println("关闭电脑")
}

//为Phone实现接口方法
func (p Phone)start(){
    fmt.Println("启动手机")
}
func (p Phone)stop(){
    fmt.Println("关闭手机")
}

使用接口

//在另一个函数中使用接口中的方法
func working(u usber){
    u.start()
    u.stop()
}

func main(){
    cm := Computer{"戴尔","F1234"}
    working(cm)//启动电脑,关闭电脑
    
    p := Phone{"华为","M10"}
    working(p)//启动手机,关闭手机
}

实现接口的结构体就像Java语言中实现接口的子类一样,后续使用时用结构体代替参数中的接口进行具体操作,则和运行时多态类似。

//work定义
func working(u user){
    ...
}

//具体使用
cm:=Computer{...}
p:=Phone{...}
working(cm)
working(p)

只有实现了接口中的所有方法,才算实现了接口,才能用接口类型接收。如果只是实现了部分方法,则不能接收该类型。

2)定义接口变量,去接收实现了接口的结构体

type studier interface {
    read()
}
type Person struct{
    name string
    age int
}

func (p Person)read(){
    fmt.Println(p.name,"正在学习")
}
func main(){
    //定义接口变量
    var s studier
    //用接口变量接收实现了接口的结构体
    s = Person{"lnj",33}
}

用接口接收结构体后,只能进行整体访问不能进行单个内部数值修改,因为接口没有自己的属性:

fmt.Println(s) //正确
fmt.Println(s.name)//错误

要想访问结构体属性,必须将接口类型还原为原始类型:

方法①:类型断言 ok-idiom

if p,ok :=s.(Person);ok{
    fmt.Println(p,p.name)
}

这种s.(Person)的写法称为类型断言,通过这种ok-idiom的方式可以将接口类型还原为原始类型

方法②:type switch

switch p := s.(type){
    catch Person:
        p.name="zs"
        fmt.Println(p) //{zs 33}
    default:
        fmt.Println("不是Person类型")
}

  

 

posted @ 2023-08-22 10:15  ShineLe  阅读(4)  评论(0编辑  收藏  举报