下面由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)