hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 后端开发 - 正文 君子好学,自强不息!

关于 golang 的接口引见_后端开发

2020-09-15后端开发搜奇网4°c
A+ A-
下面由 golang教程栏目给人人引见关于 golang 的接口,愿望对需要的朋侪有所协助!

在Go言语中接口(interface)是一种范例,一种笼统的范例。

接口的定义

定义花样:

type 接口范例名 interface{
    要领名1( 参数列表1 ) 返回值列表1
    要领名2( 参数列表2 ) 返回值列表2
    …
}

Go言语的接口在定名时,平常会在单词背面增加er,接口名最好要能凸起该接口的范例寄义。

接口完成

一个对象只需悉数完成了接口中的要领,那末就完成了这个接口。
Go言语中差别的范例能够完成同一个接口。(示例中dog和cat都完成了Animal接口)

//定义一个Animal接口// Animal 是一个动物接口,完成move()和say()要领type Animal interface {
    move()
    say()
}//定义dog构造体type dog struct {
    name string
}//定义cat构造体type cat struct {
    name string
}//dog完成move要领func (d dog) move() {
    fmt.Printf("%s会跑\n",d.name)
}//dog完成say要领func (d dog) say() {
    fmt.Printf("%s会叫汪汪汪\n",d.name)
}//cat完成move要领func (c *cat) move() {
    fmt.Printf("%s会跑\n",c.name)
}//cat完成say要领func (c cat) say() {
    fmt.Printf("%s会叫喵喵喵\n",c.name)
}func main()  {    var a Animal    //声明一个Animal范例的a    //实例化一个dog构造体
    d := dog{name:"旺财"}
    fmt.Printf("%T\n", d)       //main.dog
    d.move()    //旺财会跑
    d.say()     //旺财会叫汪汪汪
    a = d // 接口是一种范例,一种笼统的范例。
    fmt.Println(a)  //{旺财}    //实例化一个cat构造体
    c := cat{name:"蓝猫"}
    c.move()    //蓝猫会跑
    c.say()     //蓝猫会叫喵喵喵
}

多态

GO言语经由过程接口模仿多态。

范例与接口关联

一个范例能够同时完成多个接口,而接口间相互自力,不知道对方的完成。
Go言语中差别的范例能够完成同一个接口。

接口嵌套

接口与接口间能够经由过程嵌套制造出新的接口。

//定义speaker接口type speaker interface {
    speak()
}//定义mover接口type mover interface {
    move()
}// 接口嵌套type animal interface {
    speaker
    mover
}//定义cat构造体type cat struct {
    name string
}//cat是值范例接收者func (c cat) speak() {
    fmt.Println("喵喵喵")
}func (c cat) move() {
    fmt.Println("猫会动")
}func main()  {    var x animal
    x = cat{name: "花花"}
    x.move()    //猫会动
    x.speak()   //喵喵喵
}

空接口

空接口定义

空接口是指没有定义任何要领的接口。空接口范例的变量能够存储恣意范例的变量。

//空接口func main()  {    var x interface{}
    x = 100     //int范例
    fmt.Println(x)  //100
    x = "ares"  //string范例
    fmt.Println(x)  //ares
    x = struct {    //构造体范例
        name string
    }{name:"ares"}  //构造体赋值
    fmt.Println(x)  //ares
}

空接口运用

空接口能够作为函数的参数或map的值。

//空接口func showType(a interface{}) {
    fmt.Printf("type:%T\n", a)
}func main()  {    //空接口作为函数的参数
    showType(100)       //type:int
    showType("ares")    //type:string    //定义一个值为空接口的map    var stu = make(map[string]interface{},100)
    stu["ares"] = 100
    stu["ares1"] = "男"
    fmt.Println(stu)    //map[ares:100 ares1:男]    //map,key是字符串,value是恣意范例
    map1 := make(map[string]interface{})
    map1["name"] = "ares"
    map1["age"] = 18
    map1["id"] = 1
    map1["friend"] = struct {
        name string
        age  int
    }{"jay", 33}
    fmt.Println(map1) //map[age:18 friend:{jay 33} id:1 name:ares]
    }

接口嵌套

类似于继续。

type A interface {
    test1()
}type B interface {
    test2()
}type C interface {
    A
    B
    test3()
}type Cat struct { //假如要完成接口c,需要将接口a和接口b中的要领一同完成
}func (c Cat) test1() {
    fmt.Println("test1...")
}func (c Cat) test2() {
    fmt.Println("test2...")
}func (c Cat) test3() {
    fmt.Println("test3...")
}func main() {    var cat = Cat{}
    cat.test1() //test1...
    cat.test2() //test2...
    cat.test3() //test3...    //将cat赋值接口A范例,则只能运用test1要领    var cat1 A = Cat{}
    cat1.test1() //test1...    //将cat赋值接口B范例,则只能运用test2要领    var cat2 B = Cat{}
    cat2.test2() //test2...
}

范例断言

语法:

x.(T)

x:示意范例为interface{}的变量
T:示意断言x大概是的范例
若为true则示意断言胜利,为false则示意断言失利。

//范例断言func justifyType(x interface{}) {    switch v := x.(type) {    case string:
        fmt.Printf("x is a string,value is %v\n", v)    case int:
        fmt.Printf("x is a int is %v\n", v)    case bool:
        fmt.Printf("x is a bool is %v\n", v)    case *string:
        fmt.Printf("x is a point指针 is %v\n", v)    case struct{}:
        fmt.Printf("x is a struct is %v\n", v)    default:
        fmt.Println("unsupport type!")
    }}func main()  {
    justifyType(100)        //x is a int is 100
    justifyType("ares") //x is a string,value is ares
    justifyType(false)  //x is a bool is false
    x := "ares"
    justifyType(&x) //x is a point指针 is 0xc000094010
    justifyType(struct {}{})    //x is a struct is {}
    justifyType([]int{123}) //unsupport type!
}

值接收者指针接收者完成接口的区分

假如接收者为指针范例的话,不能把值传进去。

//定义animal接口type animal interface {
    speak()
    move()
}//定义cat构造体type cat struct{
    name string
}//定义dog构造体type dog struct{
    name string
}//值接收者
 func (c cat) speak() {
    fmt.Printf("%s会叫喵喵喵\n",c.name)
 } func (c cat) move() {
    fmt.Printf("%s会动\n",c.name)
 } //指针接收者func (d *dog) speak() {
    fmt.Printf("%s会叫汪汪汪\n",d.name)
}func (d *dog) move() {
    fmt.Printf("%s会动\n",d.name)
}func main()  {    var c1 animal
    lm := cat{name:"蓝猫"}
    c1 = lm     //由于完成animal接口的是cat值范例,所以能够直接赋值
    c1.move()   //蓝猫会动
    c1.speak()  //蓝猫会叫喵喵喵    var c2 animal
    jm := &dog{name:"金毛"}   //现animal接口的是*dog范例,所以必需要经由过程&来取值
    c2 = jm
    c2.move()   //金毛会动
    c2.speak()  //金毛会叫汪汪汪
}

以上就是关于 golang 的接口引见的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
关于 golang 的接口引见_后端开发

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

本文来源:搜奇网

本文地址:https://www.sou7.cn/300733.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。