Es gibt keine Kurse in Golang. Golang ist keine reine objektorientierte Programmiersprache, es gibt kein Klassenkonzept, Go kann jedoch auch objektorientierte Programmierung simulieren. In Go kann struct mit einer Klasse in anderen Sprachen verglichen werden; eine Struktur wird durch struct definiert, um einen Objekttyp darzustellen, wie zum Beispiel „type person struct {...}“.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.
Drei Hauptmerkmale der Objektorientierung: Kapselung, Vererbung und Polymorphismus.
Go ist keine reine objektorientierte Programmiersprache. Es gibt kein Klassenkonzept und keine Vererbung. Go kann aber auch objektorientierte Programmierung simulieren, d. h. struct kann mit Klassen in anderen Sprachen verglichen werden.
Go verfügt nicht über das Konzept einer Klasse. Es definiert eine Struktur durch struct, um einen Objekttyp darzustellen.
type person struct { Age int Name string }
Objekte sind Zustands- und Verhaltensorganismen. Zum Beispiel der folgende Java-Code:
public class Person { int age; String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Im Gegensatz zu Java müssen die Methoden von Go nicht an die Klassendaten in einer Klassendefinition gebunden sein, müssen nur im selben Paket definiert werden . Dies mag für Go-Neulinge seltsam erscheinen.
type person struct { Age int Name string } func (p *person) GetAge() int { return p.Age } func (p *person) SetAge(age int) { p.Age = age } func (p *person) GetName() string { return p.Name } func (p *person) SetName(name string) { p.Name = name }
Go hat keinen Konstruktor und der Datenträger des Objekts ist eine Struktur. Java unterstützt Konstruktoren. Der Name des Konstruktors ist derselbe wie der Klassenname. Mehrere Konstruktoren werden durch Funktionsüberladung implementiert.
Der Go-Konstruktor wird durch eine Factory-Funktion simuliert. Ein Beispiel lautet wie folgt:
type person struct { Age int Name string } /** 构造函数1--通过名字初始化 */ func newPersonByName(name string) *person { return &person{ Name: name, } } /** 构造函数2--通过年龄初始化 */ func newPersonByAge(age int) *person { return &person{ Age: age, } }
Es ist zu beachten, dass der erste Buchstabe des Namens der Personenstruktur in Kleinbuchstaben geschrieben werden sollte, um eine externe direkte Umgehung des simulierten Konstruktors zu vermeiden
Java verfügt über vier Zugriffsberechtigungen: wie folgt:
öffentlich | geschützt |
freundlich (Standard) |
privat | |
gleiche Klasse | ja | ja | ja | ja |
Das gleiche Paket | ja | ja | ja | nein |
verschiedene Paketunterklassen | ja | ja | nein | nein |
verschiedene Paket-Nicht-Unterklassen | ja | nein | nein | nein |
Go ist vereinfacht. Mit anderen Worten: Go behält zwei Typen bei: freundlich und öffentlich. Wenn der erste Buchstabe eines Go-Variablennamens ein Kleinbuchstabe ist, bedeutet dies, dass er innerhalb des Pakets sichtbar ist. Wenn der erste Buchstabe ein Großbuchstabe ist, bedeutet dies, dass er überall sichtbar ist.
Kapselung, Bindung der abstrakten Struktur an die Funktionen, die mit den internen Daten der Struktur arbeiten. Externe Programme können den internen Status der Struktur nur gemäß der exportierten Funktions-API (öffentliche Methode) ändern.
Kapselung hat zwei Vorteile:
Implementierung ausblenden: Wir möchten nur, dass Benutzer die API direkt verwenden, um den internen Status der Struktur zu bedienen, ohne die interne Logik zu kennen. Wie bei einem Eisberg sehen wir nur den Teil über dem Wasser.
Daten schützen: Wir können Sicherheitsmaßnahmen für Datenänderungen und -zugriffe festlegen, wir können die Parameter überprüfen, wenn wir die Getter-Methode aufrufen, wir können Zugriffsprotokolle hinzufügen usw.
Eine einfache Bean-Definition lautet wie folgt:
type person struct { Age int Name string } func NewPerson(age int, name string) *person{ return &person{age, name} } func (p *person) SetAge(age int) { p.Age = age } func (p *person) SetName(name string) { p.Name = name } func main() { p:= NewPerson(10, "Lily") p.SetName("Lucy") p.SetAge(18) }
Es ist zu beachten, dass die Methode von Go eine spezielle Funktion ist, die nur eine Art syntaktischer Zucker für den Compiler ist. Der Compiler hilft uns, die Referenz des Objekts als Funktion zu verwenden der erste Parameter. Der folgende Code entspricht beispielsweise
func main() { p:= NewPerson(10, "Lily") p.SetName("Lily1") // 等价于下面的写法 // p是一个引用,函数引用 setNameFunc := (*person).SetName setNameFunc(p, "Lily2") fmt.Println(p.Name) }
inheritance. Wenn eine untergeordnete Klasse die übergeordnete Klasse erbt, erhält sie die Eigenschaften und Verhaltensweisen der übergeordneten Klasse. Der Hauptzweck der Vererbung besteht darin, Code wiederzuverwenden. Die beiden wichtigsten Tools von Java für die Wiederverwendung von Code sind Vererbung und Komposition.
Go hat kein Klassenkonzept und es gibt keine Vererbung. Aber Go kann die Vererbung durch anonyme Komposition simulieren.
Wie unten gezeigt, erhält Cat automatisch die Methoden move() und Shout() von Animal, indem es die Animal-Struktur anonym aggregiert:
type Animal struct { Name string } func (Animal) move() { fmt.Println("我会走") } func (Animal) shout() { fmt.Println("我会叫") } type Cat struct { Animal // 匿名聚合 } func main() { cat := &Cat{Animal{"猫"}} cat.move() cat.shout() }
Polymorphismus, der als Variable der Basisklasse deklariert ist, kann auf verschiedene Unterklassen verweisen zur Laufzeit und Aufrufmethoden verschiedener Unterklassen. Der Zweck des Polymorphismus besteht darin, Einheitlichkeit zu erreichen.
Wir implementieren Polymorphismus durch Schnittstellen. In Java definieren wir Schnittstellen durch Interfaces und implementieren Schnittstellen durch Implements.
interface Animal { void move(); void shout(); } class Dog implements Animal { @Override public void move() { System.out.println("我会走"); } @Override public void shout() { System.out.println("我会叫"); } }
Und Go schließt durch den Ententyp, dass ein Objekt eine Ente ist, solange es wie eine Ente aussieht und wie eine Ente quakt. Mit anderen Worten: Die Schnittstelle von Go ist relativ verborgen. Solange ein Objekt alle von der Schnittstelle deklarierten Methoden implementiert, wird es als zur Schnittstelle gehörend betrachtet.
type Animal interface { move() shout() } type Cat struct { Animal // 匿名聚合 } func (Cat)move() { fmt.Println("猫会走") } func (Cat)shout() { fmt.Println("猫会叫") } type Dog struct { Animal // 匿名聚合 } func (Dog)move() { fmt.Println("狗会走") } func (Dog)shout() { fmt.Println("狗会叫") } func main() { cat := Cat{} dog := Dog{} // 申明接口数组 animals := []Animal{cat, dog} for _,ele := range animals { // 统一访问 ele.move() ele.shout() } }
【Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht】
Das obige ist der detaillierte Inhalt vonGibt es Kurse in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!