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

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

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

前言

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

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

什么是接口(interface)

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

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

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

注:

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

為什么需要接口

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

回顧繼承

車結構體

//
type Car struct {
Brand string //車品牌
CarNum string //車牌號
Tyre int //輪胎個數
}

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

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

寶馬車

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

比亞迪車

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

main代碼

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

執行結果

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

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

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

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

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

定義接口

車接口

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

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

寶馬車

//寶馬車
type BMWCar struct {
Owner string //車主
Brand string //車品牌
CarNum string //車牌號
}
//構造方法
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,我車牌號為 %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轉彎\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("你妹的,你電動車加啥油...\n")
}

func (this *Electromobile) Wheel(direction string) {
fmt.Printf("我正在%s轉彎\n", direction)
}

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

main

func main() {
var 張三的車 Car
張三的車 = NewBMWCar("張三""寶馬6""京666")
張三的車.Run(80)
張三的車.Refuel(20)
張三的車.Wheel("左")

var 李四的車 Car
李四的車 = NewElectromobile("李四""小刀電動車")
李四的車.Run(40)
李四的車.Refuel(0)
李四的車.Wheel("左")
}

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

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

執行結果

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

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

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

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

一個結構體實現多個接口

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

接口代碼

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

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

結構體代碼

//袋鼠結構體
type Roo struct {
Name string
}

func (this *Roo) Jump() {
fmt.Println("我是袋鼠,我會跳")
}

func (this *Roo) Run() {
fmt.Println("我是袋鼠,我會跑")
}

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

main代碼

func main() {
var runner Runer
var jumper Jumper

runner = &Roo{Name: "袋鼠"}
jumper = &Roo{Name: "袋鼠"}

runner.Run()
jumper.Jump()
}

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

執行結果

接口嵌套

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

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

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

接口示例代碼

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

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

//動物接口,繼承了 跑 和 跳
type Animal interface {
Runer
Jumper
}

結構體代碼

//袋鼠結構體,實現了跑和跳
type Roo struct {
Name string
}

func (this *Roo) Jump() {
fmt.Println("我是袋鼠,我會跳")
}

func (this *Roo) Run() {
fmt.Println("我是袋鼠,我會跑")
}

main代碼

func main() {
var animal Animal

animal = &Roo{Name: "袋鼠"}
animal = &Roo{Name: "袋鼠"}

animal.Run()
animal.Jump()
}

執行結果

總結

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

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

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

本文轉載自微信公眾號「Go語言進階學習」,可以通過以下二維碼關注。轉載本文請聯系Go語言進階學習公眾號。

責任編輯:武曉燕 來源: Go語言進階學習
相關推薦

2020-12-09 09:59:32

Go語言技術

2020-12-07 05:59:02

語言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-10-25 07:33:13

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基礎函數

2020-10-22 11:15:47

Go語言變量

2021-09-29 10:00:07

Go語言基礎

2021-10-13 10:00:52

Go語言基礎

2021-10-16 10:17:51

Go語言數據類型

2020-12-23 08:39:11

Go語言基礎技術

2021-09-27 09:18:30

ListIterato接口方法

2021-02-20 10:06:14

語言文件操作
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91文字幕巨乱亚洲香蕉 | 天天草天天爱 | 亚洲精品成人av久久 | 中文字幕在线看第二 | 日韩电影a | 亚洲精品久久久久久一区二区 | 亚洲免费精品 | 国产成人精品一区二区三区四区 | 国产aⅴ | 一区二区在线不卡 | 欧美黄色片 | 四虎影视免费观看 | 亚洲精品视频免费 | 亚洲精品一区二区三区在线 | 99精品视频在线观看免费播放 | 婷婷在线免费 | 91大神在线资源观看无广告 | 精品区 | 国产欧美精品在线观看 | 久久亚洲欧美日韩精品专区 | 黄a网| 久久99国产精品 | 欧美一级片黄色 | 欧美日韩在线免费观看 | 欧美性网| 天天插天天操 | 99爱国产 | 亚洲小视频在线播放 | 久久这里只有 | 久久久性色精品国产免费观看 | 中文字幕视频在线 | 精品一区二区三区四区 | 久草在线影| 久久久精品网 | 久久av资源网 | 美女二区| 99爱在线视频 | 欧美一级二级视频 | 国产91精品网站 | 国产色婷婷| 69堂永久69tangcom |