内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

關(guān)于golang的接口介紹

下面由golang教程欄目給大家介紹關(guān)于 golang 的接口,希望對需要的朋友有所幫助!

成都創(chuàng)新互聯(lián)長期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為東平企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計,東平網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

在Go語言中接口(interface)是一種類型,一種抽象的類型。

接口的定義

定義格式:

type 接口類型名 interface{
    方法名1( 參數(shù)列表1 ) 返回值列表1
    方法名2( 參數(shù)列表2 ) 返回值列表2
    …
}

Go語言的接口在命名時,一般會在單詞后面添加er,接口名最好要能突出該接口的類型含義。

接口實現(xiàn)

一個對象只要全部實現(xiàn)了接口中的方法,那么就實現(xiàn)了這個接口。
Go語言中不同的類型可以實現(xiàn)同一個接口。(示例中dog和cat都實現(xiàn)了Animal接口)

//定義一個Animal接口// Animal 是一個動物接口,實現(xiàn)move()和say()方法type Animal interface {
    move()
    say()
}//定義dog結(jié)構(gòu)體type dog struct {
    name string
}//定義cat結(jié)構(gòu)體type cat struct {
    name string
}//dog實現(xiàn)move方法func (d dog) move() {
    fmt.Printf("%s會跑\\n",d.name)
}//dog實現(xiàn)say方法func (d dog) say() {
    fmt.Printf("%s會叫汪汪汪\\n",d.name)
}//cat實現(xiàn)move方法func (c *cat) move() {
    fmt.Printf("%s會跑\\n",c.name)
}//cat實現(xiàn)say方法func (c cat) say() {
    fmt.Printf("%s會叫喵喵喵\\n",c.name)
}func main()  {    var a Animal    //聲明一個Animal類型的a    //實例化一個dog結(jié)構(gòu)體
    d := dog{name:"旺財"}
    fmt.Printf("%T\\n", d)       //main.dog
    d.move()    //旺財會跑
    d.say()     //旺財會叫汪汪汪
    a = d // 接口是一種類型,一種抽象的類型。
    fmt.Println(a)  //{旺財}    //實例化一個cat結(jié)構(gòu)體
    c := cat{name:"藍貓"}
    c.move()    //藍貓會跑
    c.say()     //藍貓會叫喵喵喵
}
多態(tài)

GO語言通過接口模擬多態(tài)。

類型與接口關(guān)系

一個類型可以同時實現(xiàn)多個接口,而接口間彼此獨立,不知道對方的實現(xiàn)。
Go語言中不同的類型可以實現(xiàn)同一個接口。

接口嵌套

接口與接口間可以通過嵌套創(chuàng)造出新的接口。

//定義speaker接口type speaker interface {
    speak()
}//定義mover接口type mover interface {
    move()
}// 接口嵌套type animal interface {
    speaker
    mover
}//定義cat結(jié)構(gòu)體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 {    //結(jié)構(gòu)體類型
        name string
    }{name:"ares"}  //結(jié)構(gòu)體賦值
    fmt.Println(x)  //ares
}
空接口應(yīng)用

空接口可以作為函數(shù)的參數(shù)或map的值。

//空接口func showType(a interface{}) {
    fmt.Printf("type:%T\\n", a)
}func main()  {    //空接口作為函數(shù)的參數(shù)
    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 { //如果要實現(xiàn)接口c,需要將接口a和接口b中的方法一起實現(xiàn)
}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!
}
值接收者和指針接收者實現(xiàn)接口的區(qū)別

如果接收者為指針類型的話,不能把值傳進去。

//定義animal接口type animal interface {
    speak()
    move()
}//定義cat結(jié)構(gòu)體type cat struct{
    name string
}//定義dog結(jié)構(gòu)體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     //因為實現(xiàn)animal接口的是cat值類型,所以可以直接賦值
    c1.move()   //藍貓會動
    c1.speak()  //藍貓會叫喵喵喵    var c2 animal
    jm := &dog{name:"金毛"}   //現(xiàn)animal接口的是*dog類型,所以必須要通過&來取值
    c2 = jm
    c2.move()   //金毛會動
    c2.speak()  //金毛會叫汪汪汪
}

名稱欄目:關(guān)于golang的接口介紹
標(biāo)題URL:http://www.rwnh.cn/article38/cjossp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、App開發(fā)、服務(wù)器托管品牌網(wǎng)站設(shè)計、Google、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
志丹县| 绥宁县| 绵竹市| 三原县| 新巴尔虎左旗| 花莲县| 咸丰县| 安阳市| 盖州市| 黑龙江省| 太谷县| 光泽县| 晋城| 响水县| 高阳县| 静海县| 宁晋县| 青冈县| 青田县| 阳原县| 黄石市| 平江县| 通河县| 长寿区| 樟树市| 永靖县| 辽宁省| 应城市| 浑源县| 绵竹市| 阿尔山市| 九台市| 和田县| 桂阳县| 民乐县| 永宁县| 平度市| 永川市| 霍邱县| 新泰市| 武川县|