zoukankan      html  css  js  c++  java
  • 接口

    什么是接口

    在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。

    接口是一系列方法的集合

    例如:鸭子会叫会跑,叫起来像,跑起来像就是鸭子

    语法

    type 接口名 interface{
        方法一
     方法二
    }
    package main
    
    import "fmt"
    
    type Duck interface{  //定义一个鸭子接口
        speak()
        run()
    }
    type PDuck struct {
        name string
        age string
    }
    func (p PDuck)run(){
        fmt.Println("我是水鸭子,我的名字叫",p.name,"我划水贼溜")
    }
    func (p PDuck)speak(){
        fmt.Println("我是水鸭子,我的名字叫",p.name,"我是话痨")
    }
    
    
    type TDuck struct {
        name string
        age string
        wife bool
    }
    func (p TDuck)run(){
        fmt.Println("我是水鸭子,我的名字叫",p.name,"我划水贼溜")
    }
    func (p TDuck)speak(){
        fmt.Println("我是旱鸭子,我的名字叫",p.name,"我是话痨")
    }
    func main() {
        pD:=PDuck{name:"水鸭子"}
        tD:=TDuck{name:"旱老鸭"}
        speak(pD)
        speak(tD)
    }
    
    func speak(p Duck){  //只要是鸭子类型就能说话
        p.speak()
    }

    类型断言

    类型断言用于提取接口的底层值(Underlying Value)。

    在语法 i.(T) 中,接口 i 的具体类型是 T,该语法用于获得接口的底层值。

    就比如上面的旱鸭子就是鸭子类型

    package main
    
    import "fmt"
    
    type Duck interface{  //定义一个鸭子接口
        speak()
        run()
    }
    type PDuck struct {
        name string
        age string
    }
    func (p PDuck)run(){
        fmt.Println("我是水鸭子,我的名字叫",p.name,"我划水贼溜")
    }
    func (p PDuck)speak(){
        fmt.Println("我是水鸭子,我的名字叫",p.name,"我是话痨")
    }
    
    
    type TDuck struct {
        name string
        age string
        wife bool
    }
    func (p TDuck)run(){
        fmt.Println("我是水鸭子,我的名字叫",p.name,"我划水贼溜")
    }
    func (p TDuck)speak(){
        fmt.Println("我是旱鸭子,我的名字叫",p.name,"我是话痨")
    }
    func main() {
        tD:=TDuck{name:"旱老鸭"}
        speak(tD)
    
    }
    func speak(p Duck)  {
        //类型断言,我断言你是TDuck类型,如果没有问题,转成TDuck类型
        a:=p.(TDuck)
        fmt.Println(a.wife)
        p.speak()
    }

    类型选择

    类型选择用于将接口的具体类型与很多 case 语句所指定的类型进行比较。它与一般的 switch 语句类似。唯一的区别在于类型选择指定的是类型,而一般的 switch 指定的是值。

    类型选择的语法类似于类型断言。类型断言的语法是 i.(T),而对于类型选择,类型 T 由关键字 type 代替。

    package main
    
    import "fmt"
    type Duck interface {
        run()
        speak()
    }
    
    type PDuck struct {
        name string
        age string
    }
    
    func (p PDuck)run()  {
        fmt.Println("我是普通鸭子,我名字叫",p.name,"我走路歪歪扭扭")
    }
    func (p PDuck)speak()  {
        fmt.Println("我是普通鸭子,我名字叫",p.name,"我嘎嘎说话")
    }
    
    type TDuck struct {
        name string
        age string
        wife bool
    }
    
    func (p TDuck)run()  {
        fmt.Println("我是普通鸭子,我名字叫",p.name,"我走路歪歪扭扭")
    }
    func (p TDuck)speak()  {
        fmt.Println("我是普通鸭子,我名字叫",p.name,"我嘎嘎说话")
    }
    
    func speak(p Duck)  {
        switch a:=p.(type) {
        case PDuck:
            //判断好了,你是普通鸭子,把鸭子名字拿出来
            fmt.Println("你是普通鸭子")
            fmt.Println(a.name)
        case TDuck:
            //判断好了,你是唐老鸭,把唐老鸭的wife拿出来
            fmt.Println("你是唐老鸭")
    
            fmt.Println(a.wife)
    
    
        }
    }

    匿名空接口

    所有的数据类型都实现了空接口
    package main
    
    import "fmt"
    
    type Empty interface {
    
    }
    type TDuck2 struct {
        name string
        age string
        wife bool
    }
    func main() {
        test(1)
        test("ssss")
        test(TDuck2{})
        test(10.45)
    
    
    }
    
    func test(a interface{})  {
        switch a.(type) {
        case int:
            fmt.Println("你是int类型")
        case string:
            fmt.Println("你是string ")
        case TDuck2:
            fmt.Println("你是唐老鸭")
        default:
            fmt.Println("我不知道你是什么类型")
    
        }
    }
  • 相关阅读:
    [Noip模拟题]教主的魔法
    [Usaco2005 Jan]Muddy Fields泥泞的牧场
    机器学习-数据可视化神器matplotlib学习之路(三)
    机器学习-数据可视化神器matplotlib学习之路(二)
    机器学习-数据可视化神器matplotlib学习之路(一)
    机器学习-ID3决策树算法(附matlab/octave代码)
    Hive安装-windows(转载)
    windows下hadoop安装配置(转载)
    C#发送邮件异常:根据验证过程,远程证书无效
    C#多线程--线程池(ThreadPool)
  • 原文地址:https://www.cnblogs.com/xiongying4/p/12029941.html
Copyright © 2011-2022 走看看