<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一篇文章帶你了解Go語言基礎(chǔ)之接口(上篇)

          共 4321字,需瀏覽 9分鐘

           ·

          2020-12-06 02:44

          點(diǎn)擊上方“Go語言進(jìn)階學(xué)習(xí)”,進(jìn)行關(guān)注

          回復(fù)“Go語言”即可獲贈(zèng)從入門到進(jìn)階共10本電子書

          我從去年辭帝京,謫居臥病潯陽城。

          前言

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

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


          什么是接口(interface)

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

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


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

          注:

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


          為什么需要接口

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


          回顧繼承

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

          //車type Car struct {    Brand  string //車品牌    CarNum string //車牌號(hào)    Tyre   int    //輪胎個(gè)數(shù)}
          //給車綁定一個(gè)方法,說明車的基本信息func (this *Car) carInfo() { fmt.Printf("品牌:%s,車牌號(hào):%s,輪胎個(gè)數(shù):%d\n", this.Brand, this.CarNum, this.Tyre)}

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


          寶馬車

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


          比亞迪車

          //比亞迪車type BYDCar struct {    *Car}


          main代碼

          func main() {    //一個(gè)寶馬對(duì)象    var bmw1 = BMWCar{&Car{        Brand:  "寶馬x8"        CarNum: "京666",        Tyre:   4,    }}    //一個(gè)比亞迪對(duì)象    var byd1 = BYDCar{&Car{        Brand:  "比亞迪L3"        CarNum: "京111",        Tyre:   4,    }}    //因?yàn)?BMWCar 和 BYDCar 都繼承了Car,所以都有carInfo這個(gè)方法    bmw1.carInfo()    byd1.carInfo()}

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

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

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

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

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

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


          定義接口

          車接口

          type Car interface {    //車會(huì)跑    Run(speed int)    //車需要加油    Refuel(oil int)    //車需要轉(zhuǎn)彎    Wheel(direction string)}

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


          寶馬車

          //寶馬車type BMWCar struct {    Owner  string //車主    Brand  string //車品牌    CarNum string //車牌號(hào)}//構(gòu)造方法func NewBMWCar(owner string, brand string, carNum string) *BMWCar {    return &BMWCar{Owner: owner, Brand: brand, CarNum: carNum}}
          func (this *BMWCar) Run(speed int) { fmt.Printf("我是 %s,我的車是 %s,我車牌號(hào)為 %s,我正在以 %d 速度行駛\n", this.Owner, this.Brand, this.CarNum, speed)}
          func (this *BMWCar) Refuel(oil int) { fmt.Printf("老板,加%d升油\n", oil)}
          func (this *BMWCar) Wheel(direction string) { fmt.Printf("我正在%s轉(zhuǎn)彎\n", direction)}


          電瓶車

          //電瓶車type Electromobile struct {    Owner string //車主    Brand string //車品牌}
          func NewElectromobile(owner string, brand string) *Electromobile { return &Electromobile{Owner: owner, Brand: brand}}func (this *Electromobile) Run(speed int) { fmt.Printf("我是 %s,我的車是 %s,我正在以 %d 速度行駛\n", this.Owner, this.Brand,, speed)}
          func (this *Electromobile) Refuel(oil int) { fmt.Printf("你妹的,你電動(dòng)車加啥油...\n")}
          func (this *Electromobile) Wheel(direction string) { fmt.Printf("我正在%s轉(zhuǎn)彎\n", direction)}

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

          main

          func main() {    var 張三的車 Car    張三的車 = NewBMWCar("張三", "寶馬6", "京666")    張三的車.Run(80)    張三的車.Refuel(20)    張三的車.Wheel("左")
          var 李四的車 Car 李四的車 = NewElectromobile("李四", "小刀電動(dòng)車") 李四的車.Run(40) 李四的車.Refuel(0) 李四的車.Wheel("左")}

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

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

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

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

          但是為啥變量類型不一致,還是可以進(jìn)行賦值并且每報(bào)錯(cuò)呢?

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

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


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

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

          接口代碼

          //跑接口type Runer interface {  Run()}
          // 跳接口type Jumper interface { Jump()}


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

          //袋鼠結(jié)構(gòu)體type Roo struct {  Name string}
          func (this *Roo) Jump() { fmt.Println("我是袋鼠,我會(huì)跳")}
          func (this *Roo) Run() { fmt.Println("我是袋鼠,我會(huì)跑")}

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


          main代碼

          func main() {  var runner Runer  var jumper Jumper
          runner = &Roo{Name: "袋鼠"} jumper = &Roo{Name: "袋鼠"}
          runner.Run() jumper.Jump()}

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

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


          接口嵌套

          接口嵌套這個(gè)有點(diǎn)像組合,比如有,等這些操作。

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

          并且把這些動(dòng)作都拿過來才對(duì)。


          接口示例代碼

          //跑接口type Runer interface {  Run()}
          // 跳接口type Jumper interface { Jump()}
          //動(dòng)物接口,繼承了 跑 和 跳 type Animal interface { Runer Jumper}


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

          //袋鼠結(jié)構(gòu)體,實(shí)現(xiàn)了跑和跳type Roo struct {  Name string}
          func (this *Roo) Jump() { fmt.Println("我是袋鼠,我會(huì)跳")}
          func (this *Roo) Run() { fmt.Println("我是袋鼠,我會(huì)跑")}


          main代碼

          func main() {  var animal Animal
          animal = &Roo{Name: "袋鼠"} animal = &Roo{Name: "袋鼠"}
          animal.Run() animal.Jump()}


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


          總結(jié)

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

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

          如果在操作過程中有任何問題,記得下面討論區(qū)留言,我們看到會(huì)第一時(shí)間解決問題。

          我是碼農(nóng)星期八,如果覺得還不錯(cuò),記得動(dòng)手點(diǎn)贊一下哈。感謝你的觀看。

          -------------------?End?-------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Go學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬水千山總是情,點(diǎn)個(gè)【在看】行不行

          瀏覽 25
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.国产在线 | 亚洲专区欧美专区 | 久久伊人一区二区 | 黄色一级电影视频 | 成人H精品动漫在线无码播放 |