专栏首页PythonistaGolang之接口(interface)

Golang之接口(interface)

Golang最重要的接口,,,,

package main

import (
    "fmt"
)

//interface类型默认是指针
/*
接口的实现
Golang中的接口,不需要显示的实现。只需要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口
因为Golang中没有implement类似的关键字
如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口
如果一个变量只含有了1个interface的部分方法,那么这个变量没有实现这个接口..

一种事物的多种形态,都可以按照统一的接口进行操作

*/

//接口嵌套
type ReadWrite interface {
    Read(b Buffer) bool
    Write(b Buffer) bool
}
type Lock interface {
    Lock()
    Unlock()
}
//嵌套,继承了前面四个方法,File就有6个方法
type File interface {
    ReadWrite
    Lock
    Close()
}
//类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型可以采用以下方法进行转换
var t int
var x interface{}
x=t
y,ok=x.(int)



//定义People结构体
type People struct {
    name string
    age  int
}

//定义Test接口
type Test interface {
    //接口有2个方法
    Print()
    Sleep()
}

//定义struct
type Student struct {
    name  string
    age   int
    score int
}

//定义Print()方法
func (p Student) Print() {
    fmt.Println("name:", p.name)
    fmt.Println("age:", p.age)
    fmt.Println("score", p.score)
}

//Sleep方法
func (p Student) Sleep() {
    fmt.Println("student sleep")
}
func (people People) Print() {
    fmt.Println("name:", people.name)
    fmt.Println("age:", people.age)
}
func (p People) Sleep() {
    fmt.Println("People Sleep")
}

func main() {
    var t Test
    //接口是个地址
    fmt.Println(t)

    var stu Student = Student{
        name:  "stu1",
        age:   20,
        score: 200,
    }
    t = stu
    t.Print()
    t.Sleep()
    fmt.Println("t:", t)

}

 //接口,空接口

package main

import "fmt"

type Carer interface {
    GetName() string
    Run()

    }

func main() {
    var a interface{} //空接口
    var b int         //具体类型
    //空接口可以保持任何类型的变量
    a = b                           // b给a赋值,空接口可以容纳任何类型    b=a //这是错的
    fmt.Printf("type of a:%T\n", a) // %T打印类型
}

 //接口的实现(车,宝马车)

package main

import "fmt"

type Carer interface {
    GetName() string
    Run()
    DiDi()
}
type BMW struct {
    Name string
}

//得实现接口所有的方法,才算实现了该接口
func (p *BMW) GetName() string {
    return p.Name
}

//因此还得实现RUN()
//指针类型*BMW,也可以写值类型 (p BMW)
func (p *BMW) Run() {
    fmt.Printf("%s is running\n", p.Name)
}

//还得实现DiDi()
func (p *BMW) DiDi() {
    fmt.Printf("%s is didi\n", p.Name)
}
func main() {
    var car Carer
    fmt.Println(car)
    //var bmw BMW
    //bmw.Name = "BMW"
    //写法2
    bmw := &BMW{
        Name: "BMW",
    }
    car = bmw
    car.Run()
}

 //Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现了这个接口。

//因此Golang中没有implement类似的关键字

//如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口

package main

import "fmt"

type Carer interface {
    GetName() string
    Run()
    DiDi()
}
type Test interface {
    Hello()
}

//宝马车
type BMW struct {
    Name string
}

//因此还得实现RUN()
//得实现接口所有的方法,才算实现了该接口
func (p *BMW) GetName() string {
    return p.Name
}

//实现接口的Run()
func (p *BMW) Run() {
    fmt.Printf("%s is running\n", p.Name)
}

//还得实现DiDi()
func (p *BMW) DiDi() {
    fmt.Printf("%s is didi\n", p.Name)
}

func (p *BMW) Hello() {
    fmt.Printf("hello,i'm %s \n", p.Name)
}

//比亚迪
type BYD struct {
    Name string
}

func (p *BYD) GetName() string {
    return p.Name
}

func (p *BYD) Run() {
    fmt.Printf("%s is running\n", p.Name)
}
func (p *BYD) DiDi() {
    fmt.Printf("%s is didi\n", p.Name)
}

func main() {
    var car Carer
    var test Test
    fmt.Println(car)
    //var bmw BMW
    //bmw.Name = "BMW"
    //写法2
    bmw := &BMW{
        Name: "BMW",
    }
    car = bmw
    car.Run()

    test = bmw
    test.Hello()

    byd := &BYD{
        Name: "BYD",
    }
    car = byd
    car.Run()
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Golang之匿名函数和闭包

     基本概念 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者 任何全局上下文中定义,而是在定义代码块的环境中定义。要执行的代码块...

    超蛋lhy
  • golang之数组

    3.长度是数组类型的一部分,因此,var a[5] int 和 var a[10]int 是不同的类型

    超蛋lhy
  • Golang之文件读写

    超蛋lhy
  • 干货 | 清华大学郑方:语音技术用于身份认证的理论与实践

    “网络空间身份认证”事关新时代的国家安全、经济安全、社会稳定、民众福祉等,这其中包括五个方面:

    数据派THU
  • 今日 Paper | ACEnet上下文编码网络;卷积网络生物系统;欺诈检测;DialogueGCN等

    论文名称:ACEnet: Anatomical Context-Encoding Network for Neuroanatomy Segmentation

    AI科技评论
  • Apache Solr Velocity模版注入远程命令执行漏洞复现以及 POC 编写

    19 年 10 月 31 日,安全研究员 S00pY 在 GitHub 发布了 ApacheSolr Velocity 模版注入远程命令执行的 POC,经过其他...

    信安之路
  • BAT面试题48:为什么引入非线性激励函数?

    如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性...

    double
  • 携程 Apollo 配置中心:Example

    本文介绍如何基于 Spring Boot 来搭建 Apollo 客户端,并展示如何动态更改运行时服务的输出日志等级。参考阅读 Apollo · Java 客户端...

    happyJared
  • wordpress面包屑导航简单实现

      前面我们学了一行代码搞定WordPress面包屑导航breadcrumb,现在wordpress文档中有一个简单实现的方法,适用于page页面,有二级分类的...

    ytkah
  • 【关关的刷题日记63】Leetcode 111 Minimum Depth of Binary Tree

    关关的刷题日记63 – Leetcode 111 Minimum Depth of Binary Tree 题目 Given a binary tree, fi...

    WZEARW

扫码关注云+社区

领取腾讯云代金券