成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

關于golang的接口介紹

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

成都創(chuàng)新互聯(lián)長期為近千家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為東平企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設計,東平網(wǎng)站改版等技術服務。擁有10余年豐富建站經驗和眾多成功案例,為您定制開發(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結構體type dog struct {
    name string
}//定義cat結構體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結構體
    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()     //藍貓會叫喵喵喵
}
多態(tài)

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

類型與接口關系

一個類型可以同時實現(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結構體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
}
空接口應用

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

名稱欄目:關于golang的接口介紹
標題URL:http://jinyejixie.com/article38/cjossp.html

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

廣告

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

成都做網(wǎng)站
民县| 罗甸县| 平江县| 阜康市| 赣州市| 上虞市| 绥化市| 刚察县| 晴隆县| 望奎县| 阿克苏市| 彝良县| 定日县| 株洲市| 肥西县| 申扎县| 南平市| 布拖县| 泰州市| 那曲县| 河北省| 扬中市| 瑞金市| 嘉鱼县| 静宁县| 阳高县| 缙云县| 泰兴市| 桦甸市| 浦城县| 宜城市| 龙南县| 新竹市| 正蓝旗| 长丰县| 龙胜| 富平县| 监利县| 余江县| 九龙城区| 天镇县|