日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一篇文章帶你了解Go語言基礎(chǔ)之接口(上篇)

前言

夏河網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,夏河網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為夏河上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的夏河做網(wǎng)站的公司定做!

Hey,大家好呀,我是碼農(nóng),星期八,之前怎么學(xué)到過面向?qū)ο蟮南嚓P(guān)知識,但是還差一點,差了個接口。

并且接口在代碼中用的還是比較多的,一起來看看吧!

什么是接口(interface)

這里的接口,可不是說那種插槽的那種接口,互相懟到一塊就完事了。

在各種語言中,提到接口,通常指的之一種規(guī)范,然后具體對象來實現(xiàn)這個規(guī)范的細節(jié)。

本文使用的接口主要是約束接口,還有一種存儲接口。

注:

在Go中,接口(interface)是一種類型,一種抽象類型,它只有方法,沒有屬性。

為什么需要接口

我們在講結(jié)構(gòu)體時,Go語言基礎(chǔ)之結(jié)構(gòu)體(春日篇)、Go語言基礎(chǔ)之結(jié)構(gòu)體(夏日篇)、Go語言基礎(chǔ)之結(jié)構(gòu)體(秋日篇),提到過繼承這個概念,Go是通過結(jié)構(gòu)體來完成繼承的。

回顧繼承

車結(jié)構(gòu)體

 
 
 
 
  1. //車
  2. type Car struct {
  3.     Brand  string //車品牌
  4.     CarNum string //車牌號
  5.     Tyre   int    //輪胎個數(shù)
  6. }
  7. //給車綁定一個方法,說明車的基本信息
  8. func (this *Car) carInfo() {
  9.     fmt.Printf("品牌:%s,車牌號:%s,輪胎個數(shù):%d\n", this.Brand, this.CarNum, this.Tyre)
  10. }

車結(jié)構(gòu)體有四個屬性,同時還有一個顯示車(carInfo)信息的方法。

寶馬車

 
 
 
 
  1. //寶馬車
  2. type BMWCar struct {
  3.     //*Car和Car基本沒有區(qū)別,一個存的是整個結(jié)構(gòu)體,一個存的是結(jié)構(gòu)體地址,用法大同小異
  4.     *Car //這就表示繼承了Car這個結(jié)構(gòu)體
  5. }

比亞迪車

 
 
 
 
  1. //比亞迪車
  2. type BYDCar struct {
  3.     *Car
  4. }

main代碼

 
 
 
 
  1. func main() {
  2.     //一個寶馬對象
  3.     var bmw1 = BMWCar{&Car{
  4.         Brand:  "寶馬x8",
  5.         CarNum: "京666",
  6.         Tyre:   4,
  7.     }
  8. }
  9.     //一個比亞迪對象
  10.     var byd1 = BYDCar{&Car{
  11.         Brand:  "比亞迪L3",
  12.         CarNum: "京111",
  13.         Tyre:   4,
  14.     }
  15. }
  16.     //因為 BMWCar 和 BYDCar 都繼承了Car,所以都有carInfo這個方法
  17.     bmw1.carInfo()
  18.     byd1.carInfo()
  19. }

執(zhí)行結(jié)果

通過回顧,我們可以發(fā)現(xiàn),車,應(yīng)該作為一個基本的概念。

上述Car結(jié)構(gòu)體似乎顯示了車的屬性,其實是不太對的。

車就是一個抽象的概念,電瓶車是車,小轎車也是車,大卡車也是車。

這些車至少有一個統(tǒng)一的功能,那就是跑,但是像幾個輪胎了,什么品牌了。

應(yīng)該是屬于自己的,不再是屬于Car這個抽象的概念中了,所以,這時候用接口會更好。

定義接口

車接口

 
 
 
 
  1. type Car interface {
  2.     //車會跑
  3.     Run(speed int)
  4.     //車需要加油
  5.     Refuel(oil int)
  6.     //車需要轉(zhuǎn)彎
  7.     Wheel(direction string)
  8. }

假設(shè)車,至少有這三個動作,不管任何結(jié)構(gòu)體,只要實現(xiàn)了Car里面的所有方法,就代表它一定是一個車。

寶馬車

 
 
 
 
  1. //寶馬車
  2. type BMWCar struct {
  3.     Owner  string //車主
  4.     Brand  string //車品牌
  5.     CarNum string //車牌號
  6. }
  7. //構(gòu)造方法
  8. func NewBMWCar(owner string, brand string, carNum string) *BMWCar {
  9.     return &BMWCar{Owner: owner, Brand: brand, CarNum: carNum}
  10. }
  11. func (this *BMWCar) Run(speed int) {
  12.     fmt.Printf("我是 %s,我的車是 %s,我車牌號為 %s,我正在以 %d 速度行駛\n", this.Owner, this.Brand, this.CarNum, speed)
  13. }
  14. func (this *BMWCar) Refuel(oil int) {
  15.     fmt.Printf("老板,加%d升油\n", oil)
  16. }
  17. func (this *BMWCar) Wheel(direction string) {
  18.     fmt.Printf("我正在%s轉(zhuǎn)彎\n", direction)
  19. }

電瓶車

 
 
 
 
  1. //電瓶車
  2. type Electromobile struct {
  3.     Owner string //車主
  4.     Brand string //車品牌
  5. }
  6. func NewElectromobile(owner string, brand string) *Electromobile {
  7.     return &Electromobile{Owner: owner, Brand: brand}
  8. }
  9. func (this *Electromobile) Run(speed int) {
  10.     fmt.Printf("我是 %s,我的車是 %s,我正在以 %d 速度行駛\n", this.Owner, this.Brand,, speed)
  11. }
  12. func (this *Electromobile) Refuel(oil int) {
  13.     fmt.Printf("你妹的,你電動車加啥油...\n")
  14. }
  15. func (this *Electromobile) Wheel(direction string) {
  16.     fmt.Printf("我正在%s轉(zhuǎn)彎\n", direction)
  17. }

這里是有區(qū)別的,電瓶車沒有屬性CarNum,但是仍然實現(xiàn)了Car接口的所有方法,所以電瓶車在代碼上,仍然是車。

main

 
 
 
 
  1. func main() {
  2.     var 張三的車 Car
  3.     張三的車 = NewBMWCar("張三", "寶馬6", "京666")
  4.     張三的車.Run(80)
  5.     張三的車.Refuel(20)
  6.     張三的車.Wheel("左")
  7.     var 李四的車 Car
  8.     李四的車 = NewElectromobile("李四", "小刀電動車")
  9.     李四的車.Run(40)
  10.     李四的車.Refuel(0)
  11.     李四的車.Wheel("左")
  12. }

第2行代碼和第8行代碼,變量類型是Car接口類型,但是在賦值時,確是其他類型。

Go是強類型語言,為什么類型不一致,還可以賦值,那執(zhí)行結(jié)果會出問題嗎???

執(zhí)行結(jié)果

但是我們發(fā)現(xiàn)執(zhí)行結(jié)果是沒問題的。

但是為啥變量類型不一致,還是可以進行賦值并且每報錯呢?

我們上述代碼可以確定寶馬車和電瓶車完全實現(xiàn)了Car接口里面所有的方法。

所以可以理解為Car就是他們的爸爸,用他們的爸爸來接收兒子,當(dāng)然可以咯。

一個結(jié)構(gòu)體實現(xiàn)多個接口

以下代碼沒有實際意義,完全是為了語法而語法。

接口代碼

 
 
 
 
  1. //跑接口
  2. type Runer interface {
  3.   Run()
  4. }
  5. // 跳接口
  6. type Jumper interface {
  7.   Jump()
  8. }

結(jié)構(gòu)體代碼

 
 
 
 
  1. //袋鼠結(jié)構(gòu)體
  2. type Roo struct {
  3.   Name string
  4. }
  5. func (this *Roo) Jump() {
  6.   fmt.Println("我是袋鼠,我會跳")
  7. }
  8. func (this *Roo) Run() {
  9.   fmt.Println("我是袋鼠,我會跑")
  10. }

這個結(jié)構(gòu)體同時實現(xiàn)了兩個結(jié)構(gòu),一個是Runer,一個是Jumper。

main代碼

 
 
 
 
  1. func main() {
  2.   var runner Runer
  3.   var jumper Jumper
  4.   runner = &Roo{Name: "袋鼠"}
  5.   jumper = &Roo{Name: "袋鼠"}
  6.   runner.Run()
  7.   jumper.Jump()
  8. }

Roo既然實現(xiàn)了兩個接口,自然兩個接口都可以接收Roo這個結(jié)構(gòu)體。

執(zhí)行結(jié)果

接口嵌套

接口嵌套這個有點像組合,比如有跑,跳,吃等這些操作。

例如一個動物,因該是要有這些操作的,那這個動物應(yīng)該也是一個接口。

并且把這些動作都拿過來才對。

接口示例代碼

 
 
 
 
  1. //跑接口
  2. type Runer interface {
  3.   Run()
  4. }
  5. // 跳接口
  6. type Jumper interface {
  7.   Jump()
  8. }
  9. //動物接口,繼承了 跑 和 跳 
  10. type Animal interface {
  11.   Runer
  12.   Jumper
  13. }

結(jié)構(gòu)體代碼

 
 
 
 
  1. //袋鼠結(jié)構(gòu)體,實現(xiàn)了跑和跳
  2. type Roo struct {
  3.   Name string
  4. }
  5. func (this *Roo) Jump() {
  6.   fmt.Println("我是袋鼠,我會跳")
  7. }
  8. func (this *Roo) Run() {
  9.   fmt.Println("我是袋鼠,我會跑")
  10. }

main代碼

 
 
 
 
  1. func main() {
  2.   var animal Animal
  3.   animal = &Roo{Name: "袋鼠"}
  4.   animal = &Roo{Name: "袋鼠"}
  5.   animal.Run()
  6.   animal.Jump()
  7. }

執(zhí)行結(jié)果

總結(jié)

上述我們學(xué)習(xí)了Go基礎(chǔ)的接口,主要學(xué)習(xí)了接口和繼承的區(qū)別,一個結(jié)構(gòu)體實現(xiàn)多個接口,接口嵌套。

可能不太好理解,但是一定要嘗試做一下,一定要堅持!


文章標題:一篇文章帶你了解Go語言基礎(chǔ)之接口(上篇)
網(wǎng)址分享:http://www.dlmjj.cn/article/dphsgjp.html