Heim  >  Artikel  >  Backend-Entwicklung  >  Ein Artikel, der Ihnen hilft, die grundlegende Benutzeroberfläche der Go-Sprache zu verstehen (Teil 1)

Ein Artikel, der Ihnen hilft, die grundlegende Benutzeroberfläche der Go-Sprache zu verstehen (Teil 1)

Go语言进阶学习
Go语言进阶学习nach vorne
2023-07-21 14:11:15768Durchsuche

Was ist eine Schnittstelle?

Die Schnittstelle hier ist nicht die Art von Schnittstelle, die ein Steckplatz ist.

Wenn in verschiedenen Sprachen Schnittstellen erwähnt werden, beziehen sie sich normalerweise auf eine Spezifikation, und dann implementieren bestimmte Objekte die Details dieser Spezifikation.

<br>

Die in diesem Artikel verwendeten Schnittstellen sind hauptsächlich Einschränkungsschnittstellen und eine Speicherschnittstelle.

Hinweis:

In Go ist eine Schnittstelle ein Typ, ein abstrakter Typ, sie hat nur Methoden, hat keine Attribute .

<br>

Warum brauchen wir Schnittstellen?

Wenn wir über Strukturen sprechen, die Struktur der Grundlagen der Go-Sprache (Frühling), die Struktur der Grundlagen der Go-Sprache (Sommer), die Struktur der Grundlagen der Go-Sprache (Herbst), erwähnte das Konzept der Vererbung, Go vervollständigt die Vererbung durch Strukturen.

<br>

Überprüfung der Vererbung

Fahrzeugstruktur

//车
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)
}

Die Fahrzeugstruktur verfügt über vier Attribute und eine Methode zum Anzeigen von Fahrzeuginformationen (carInfo). <br>

<br>

BMW-Auto

//宝马车
type BMWCar struct {
    //*Car和Car基本没有区别,一个存的是整个结构体,一个存的是结构体地址,用法大同小异
    *Car //这就表示继承了Car这个结构体
}

BYD-Auto<br>

//比亚迪车
type BYDCar struct {
    *Car
}

Hauptcode<br>

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()
}

Ausführungsergebnisse<br>

Ein Artikel, der Ihnen hilft, die grundlegende Benutzeroberfläche der Go-Sprache zu verstehen (Teil 1)

通过回顾,我们可以发现,车,应该作为一个基本的概念。<br>

上述Car结构体似乎显示了车的属性,其实是不太对的。

车就是一个抽象的概念,电瓶车是车,小轿车也是车,大卡车也是车。

这些车至少有一个统一的功能,那就是跑,但是像几个轮胎了,什么品牌了。

应该是属于自己的,不再是属于Car这个抽象的概念中了,所以,这时候用接口会更好。

<br>

定义接口

车接口

type Car interface {
    //车会跑
    Run(speed int)
    //车需要加油
    Refuel(oil int)
    //车需要转弯
    Wheel(direction string)
}

假设车,至少有这三个动作,不管任何结构体,只要实现了Car里面的所有方法,就代表它一定是一个车。<br>

<br>

宝马车

//宝马车
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)
}

电瓶车<br>

<br>
//电瓶车
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接口类型,但是在赋值时,确是其他类型。<br>

Go是强类型语言,为什么类型不一致,还可以赋值,那执行结果会出问题吗???

执行结果

Ein Artikel, der Ihnen hilft, die grundlegende Benutzeroberfläche der Go-Sprache zu verstehen (Teil 1)

但是我们发现执行结果是没问题的。<br>

Aber warum ist es möglich, Werte zuzuweisen, auch wenn die Variablentypen inkonsistent sind und jedes Mal ein Fehler gemeldet wird?

Unser obiger Code kann bestätigen, dass BMW-Autos und Batterieautos vollständig realisiert sindCarCar接口里面所有的方法。

所以可以理解为CarAlle Methoden in der Schnittstelle.

Es kann also verstanden werden als <br>Car code>

ist ihr Vater, natürlich können Sie ihren Vater nutzen, um Ihren Sohn zu empfangen.

🎜Eine Struktur implementiert mehrere Schnittstellen🎜🎜🎜🎜Der folgende Code hat keine praktische Bedeutung, er dient lediglich der Grammatik. 🎜🎜

接口代码

//跑接口
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

<br>

main代码

func main() {
  var runner Runer
  var jumper Jumper


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


  runner.Run()
  jumper.Jump()
}

Roo既然实现了两个接口,自然两个接口都可以接收Roo这个结构体。

执行结果

Ein Artikel, der Ihnen hilft, die grundlegende Benutzeroberfläche der Go-Sprache zu verstehen (Teil 1)

<br>

接口嵌套<br>

接口嵌套这个有点像组合,比如有等这些操作。

例如一个动物,因该是要有这些操作的,那这个动物应该也是一个接口。

并且把这些动作都拿过来才对。

<br>

接口示例代码

//跑接口
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()
}

执行结果

Ein Artikel, der Ihnen hilft, die grundlegende Benutzeroberfläche der Go-Sprache zu verstehen (Teil 1)

<br>

Zusammenfassung<br>

Oben haben wir die grundlegenden Schnittstellen von Go kennengelernt, hauptsächlich den Unterschied zwischen Schnittstellen und Vererbung, eine Struktur implementiert mehrere Schnittstellen , Schnittstellenverschachtelung .

Es ist vielleicht nicht leicht zu verstehen, aber Sie müssen es versuchen und durchhalten!

Das obige ist der detaillierte Inhalt vonEin Artikel, der Ihnen hilft, die grundlegende Benutzeroberfläche der Go-Sprache zu verstehen (Teil 1). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Go语言进阶学习. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen