自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

前言

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

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

什么是接口(interface)

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

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

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

注:

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

為什么需要接口

我們在講結(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 //車牌號
Tyre int //輪胎個(gè)數(shù)
}

//給車綁定一個(gè)方法,說明車的基本信息
func (this *Car) carInfo() {
fmt.Printf("品牌:%s,車牌號:%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è)寶馬對象
var bmw1 = BMWCar{&Car{
Brand: "寶馬x8",
CarNum: "京666",
Tyre: 4,
}
}
//一個(gè)比亞迪對象
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í)是不太對的。

車就是一個(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 //車牌號
}
//構(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,我車牌號為 %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)作都拿過來才對。

接口示例代碼

//跑接口
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í)間解決問題。

本文轉(zhuǎn)載自微信公眾號「Go語言進(jìn)階學(xué)習(xí)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Go語言進(jìn)階學(xué)習(xí)公眾號。

責(zé)任編輯:武曉燕 來源: Go語言進(jìn)階學(xué)習(xí)
相關(guān)推薦

2020-12-09 09:59:32

Go語言技術(shù)

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語言

2022-04-27 10:01:43

切片Go封裝

2020-12-30 09:04:32

Go語言TCPUDP

2020-10-25 07:33:13

Go語言

2021-10-09 07:10:31

Go語言基礎(chǔ)

2020-10-23 08:38:19

Go語言

2020-12-27 10:15:44

Go語言channel管道

2021-10-30 10:43:04

語言Go函數(shù)

2021-11-03 10:02:07

Go基礎(chǔ)函數(shù)

2021-09-29 10:00:07

Go語言基礎(chǔ)

2021-10-13 10:00:52

Go語言基礎(chǔ)

2020-10-22 11:15:47

Go語言變量

2021-10-16 10:17:51

Go語言數(shù)據(jù)類型

2020-12-23 08:39:11

Go語言基礎(chǔ)技術(shù)

2021-02-20 10:06:14

語言文件操作

2021-09-27 09:18:30

ListIterato接口方法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號