成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 后端
本篇我們學習Go基礎的接口,主要學習了接口和繼承的區別,一個結構體實現多個接口,接口嵌套。

 前言

Hey,大家好呀,我是碼農,星期八,之前怎么學到過面向對象的相關知識,但是還差一點,差了個接口。

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

什么是接口(interface)

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

在各種語言中,提到接口,通常指的之一種規范,然后具體對象來實現這個規范的細節。

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

注:

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

為什么需要接口

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

回顧繼承

車結構體

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

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

寶馬車

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

比亞迪車

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

main代碼

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

執行結果

 

通過回顧,我們可以發現,車,應該作為一個基本的概念。

上述Car結構體似乎顯示了車的屬性,其實是不太對的。

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

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

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

定義接口

車接口

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

假設車,至少有這三個動作,不管任何結構體,只要實現了Car里面的所有方法,就代表它一定是一個車。

寶馬車

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

電瓶車

  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. func (this *Electromobile) Run(speed int) { 
  9.     fmt.Printf("我是 %s,我的車是 %s,我正在以 %d 速度行駛\n", this.Owner, this.Brand,, speed) 
  10.  
  11. func (this *Electromobile) Refuel(oil int) { 
  12.     fmt.Printf("你妹的,你電動車加啥油...\n"
  13.  
  14. func (this *Electromobile) Wheel(direction string) { 
  15.     fmt.Printf("我正在%s轉彎\n", direction) 

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

main

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

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

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

執行結果

但是我們發現執行結果是沒問題的。

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

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

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

一個結構體實現多個接口

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

接口代碼

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

結構體代碼

  1. //袋鼠結構體 
  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("我是袋鼠,我會跑"

這個結構體同時實現了兩個結構,一個是Runer,一個是Jumper。

main代碼

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

Roo既然實現了兩個接口,自然兩個接口都可以接收Roo這個結構體。

執行結果


接口嵌套

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

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

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

接口示例代碼

  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 

結構體代碼

  1. //袋鼠結構體,實現了跑和跳 
  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("我是袋鼠,我會跑"

main代碼

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

執行結果


總結

上述我們學習了Go基礎的接口,主要學習了接口和繼承的區別,一個結構體實現多個接口,接口嵌套。

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

 

責任編輯:姜華 來源: Go語言進階學習
相關推薦

2020-10-25 07:33:13

Go語言

2022-02-16 10:03:06

對象接口代碼

2020-12-09 09:59:32

Go語言技術

2020-11-05 09:58:16

Go語言Map

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2021-10-09 07:10:31

Go語言基礎

2022-04-27 10:01:43

切片Go封裝

2020-10-23 08:38:19

Go語言

2020-12-27 10:15:44

Go語言channel管道

2020-12-30 09:04:32

Go語言TCPUDP

2021-10-30 10:43:04

語言Go函數

2021-11-03 10:02:07

Go基礎函數

2021-09-29 10:00:07

Go語言基礎

2021-10-13 10:00:52

Go語言基礎

2020-10-22 11:15:47

Go語言變量

2021-10-16 10:17:51

Go語言數據類型

2020-10-27 11:08:01

JavaScript

2020-12-23 08:39:11

Go語言基礎技術

2021-09-27 09:18:30

ListIterato接口方法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av片免费 | 51ⅴ精品国产91久久久久久 | www.亚洲精品 | а天堂中文最新一区二区三区 | 亚洲综合色视频在线观看 | 在线观看免费av网 | 国产欧美在线播放 | 一区网站| 亚洲在线观看视频 | 97精品国产97久久久久久免费 | 国产亚洲人成a在线v网站 | 欧美一区二区三区 | 午夜影院 | 黄色av大片 | 色婷婷精品国产一区二区三区 | 国产免费av在线 | 国产精品久久视频 | 天天操天天摸天天干 | 国产精品久久久久无码av | 午夜三级网站 | 麻豆一区二区三区精品视频 | 福利视频网 | 日韩在线| gogo肉体亚洲高清在线视 | 电影在线 | 日韩毛片在线观看 | 成人免费一区二区三区视频网站 | 精品乱码一区二区 | 午夜视频精品 | 国产精品69久久久久水密桃 | 亚洲免费一区二区 | av一区二区三区四区 | 在线播放中文字幕 | 久久伊人影院 | 欧美激情久久久 | 97偷拍视频 | 欧美炮房 | www.精品国产 | 亚洲1区 | 97超碰人人 | 欧美一极视频 |