Was ist und was nicht in Go. Teil 1

Hallo allerseits, am Vorabend des Starts eines neuen Threads zum Kurs „Golang Developer“ möchten wir Ihnen eine Übersetzung eines interessanten Artikels mitteilen , in dessen erstem Teil wir die Elemente in Go verstehen. Lass uns gehen.



Go wurde mit einem Rückblick erstellt und sein Basispaket ist wirklich gut zusammengesetzt: Es verfügt über Garbage Collection, Pakete, erstklassige Funktionen, einen lexikalischen Bereich, eine Systemaufrufschnittstelle und unveränderliche Zeilen, deren Text normalerweise in UTF-8 codiert ist. Es hat jedoch relativ wenige Funktionen und wird ihre Anzahl wahrscheinlich nicht erhöhen. Beispielsweise gibt es keine impliziten numerischen Konvertierungen, keine Konstruktoren oder Destruktoren, keine Operatorüberladungen, keine Standardparameterwerte, keine Vererbung, keine Generika, keine Ausnahmen, keine Makros, keine Funktionsanmerkungen und keinen lokalen Stream-Speicher.

Vor dem Lesen : Oben ist ein Auszug aus dem Buch von Alan A. A. Donovan und Brian W. Kernigan „Go Programming Language“. Seite xiv. Die unten genannten Punkte sind eine kurze und etwas unvollständige Erklärung der Begriffe, die beim Entwerfen einer Programmiersprache verwendet werden. Ich habe versucht, alle Konzepte in Bezug auf die Programmierung auf Go zu erklären. Alle unten genannten Punkte sind nicht meine Urheberschaft, sie stammen aus anderen Auszügen. Ich schütze Go oder eine andere Sprache in keiner Weise.

Jetzt werden wir versuchen, jeden Begriff kurz zu verstehen. Für einen Anfänger in der allgemeinen Programmierung ist es sehr wichtig, diese Begriffe zu kennen. Die Bedeutung all dieser Konzepte ist in jeder Programmiersprache anwendbar. Diese Begriffe können Ihnen helfen, auf einer grundlegenden Ebene zwischen verschiedenen Sprachen zu unterscheiden.

Elemente, die in Go sind


Müllabfuhr


Dieser Mechanismus ist in jeder Programmiersprache vorhanden, die eine automatische Speicherverwaltung durchführt. Um die Speicherbereinigung oder Speicherverwaltung zu verstehen, müssen Sie zunächst verstehen, wie der Speicher selbst funktioniert. Bei der Arbeit mit einer Programmiersprache weist der Compiler verschiedene Speicherplätze im System zu, um Daten zu speichern, z. B. um eine Variable zu erstellen, ein Array zu durchlaufen usw. Die Zuweisung und Umverteilung des Speichers muss implementiert werden, damit das Programm effizienter mit dem Speicher arbeitet.

In einer Sprache wie C wird der Speicher manuell verwaltet. Wenn Sie mit C vertraut sind, wissen Sie, dass es eine Malloc-Funktion gibt, die den Speicher im System dynamisch zuweist. In einer höheren Sprache wie JavaScript oder Python wird diese Zuordnung automatisch von einem Programm durchgeführt, das als Garbage Collector bezeichnet wird. Wie der Name schon sagt, besteht seine Aufgabe darin, Speicher zu verwalten, Speicherplatz zuzuweisen, wenn er benötigt wird, und zugewiesenen Speicher freizugeben, wenn er nicht mehr vorhanden ist. Go implementiert die Speicherbereinigung, sodass sich der Programmierer nicht um die Speicherverwaltung kümmern muss.

Pakete


Das Packen ist die Kombination des gesamten Quellcodes und der Ressourcen in einem Objekt, das als Paket bezeichnet wird. Das Softwarepaket ist in vielerlei Hinsicht praktisch, z. B. durch einfache Installation, Freigabe, Hinzufügen, Debuggen usw. Go verfügt über ein integriertes Paketsystem, das Dokumentation, Binärdateien und Quellcodedateien integriert. Der Zweck des Packens besteht darin, andere Softwareprojekte in Ihrer Software zu verwenden, ohne den Quellcode manuell kopieren zu müssen.

Erstklassige Funktionen


Eine erstklassige Funktion ist eine Funktion, die wie jede andere Variable verarbeitet werden kann, dh zugewiesen, zurückgegeben, exportiert, als Parameter übergeben usw. werden kann. Sehen Sie sich das folgende in Go geschriebene Snippet an. Die Funktion, die den String hello world first class function druckt, hello world first class function der Variablen a . Die Variable a verhält sich wie ein tatsächlicher Wert im Speicher, kann jedoch auch durch Hinzufügen von () am Ende als Funktion aufgerufen werden. Sie können auch sehen, dass der Wert von a wie jede andere Variable angezeigt wird. Dies ist das Grundkonzept erstklassiger Funktionen.

 package main import ( "fmt" ) func main() { a := func() { fmt.Println("hello world first class function") } a() fmt.Printf("%T", a) } 

Lexikalischer Bereich


Ein Bereich in einem Programm ähnelt einem Block oder Bereich, in dem die Definition einer Variablen / Funktion gültig ist. Beispielsweise behält eine in einer Funktion deklarierte Variable ihren Wert nur innerhalb dieses Funktionsblocks bei, dh zwischen geschweiften Klammern {} . Wenn Sie versuchen, auf den Wert einer solchen Variablen außerhalb dieses Funktionsblocks zuzugreifen, kann das Programm ihn nicht finden.

 package main import “fmt” func main() { { v := 1 { fmt.Println(v) } fmt.Println(v) } fmt.Println(v) // “undefined: v” compilation error } 

In dem gegebenen Fragment gibt es vier Sichtbarkeitsbereiche. Die erste ist die globale Region, die zweite ist die main () Funktion, die dritte ist der erste Block innerhalb der main und die vierte ist die Region, in der fmt.Println zum ersten Mal fmt.Println wird. Von den drei Println letzterer einen Kompilierungsfehler aus. Dies liegt daran, dass die Definition der Variablen v nur in den Bereichen drei und vier verfügbar ist. Wenn Println mit v als Parameter übergeben wird, sucht das Programm zuerst nach seiner Definition im aktuellen Bereich. Wenn es sie nicht finden kann, bewegt es sich im Bereich des übergeordneten Println nach außen und setzt dies fort, bis es seine Definition findet. Dies ist der lexikalische Bereich - das Programm beginnt mit der Suche nach der Definition von Variablen und Funktionen aus dem Bereich, in dem sie verwendet / aufgerufen werden, und zieht aus. Im letzten Programm fmt.Println war es nicht möglich, die Definition von v im aktuellen oder in einem übergeordneten Bereich zu finden, sodass ein Kompilierungsfehler ausgelöst wird.

Systemaufrufschnittstelle


Go wird mit einer Systemaufrufschnittstelle geliefert, die als Referenz für Systemaufrufe dient, die dem Betriebssystem zur Verfügung stehen. Zum Beispiel Öffnen und Lesen einer Datei, Eingabe und Ausgabe usw. Es fängt Funktionsaufrufe in der API ab und ruft den erforderlichen Systemaufruf im Betriebssystem auf.

Unveränderliche Saiten


Obwohl die Syntax von Go der von C ähnelt, hat sie einen Vorteil gegenüber unveränderlichen Zeilen, die in UTF-8 codiert sind. Das heißt, in Go geschriebene Programme können Zeichenfolgen mit vielen Sprachen und Zeichen bilden. In einem einfachen Sinne sind Zeichenfolgen eine Kombination / ein Array / eine Liste von Zeichen in Programmiersprachen. Da Zeichenfolgen durch Kombinieren von Zeichen gebildet werden, kann ihre Zusammensetzung geändert werden. Zeichen können hinzugefügt, gelöscht, verschoben usw. werden. Wir betrachten eine Methode, die die Unveränderlichkeit eines Strings nach seiner Deklaration garantiert. Das Konzept unveränderlicher Zeichenfolgen ist nicht neu. In Python-Zeichenfolgeninstanzen können Objekte nicht mutiert werden, JavaScript enthält auch unveränderliche Zeichenfolgen, und Ruby hat in 2.3 Frozen String Literals hinzugefügt. Dennoch haben viele beliebte Sprachen wie C ++, PHP, Perl usw. keine unveränderlichen Zeichenfolgen.

Damit endete der erste Teil des Artikels. Darin wurden die Elemente, die sich in Go befinden, zerlegt, und was nicht in Go enthalten ist, können Sie im zweiten Teil des Artikels lesen.

Source: https://habr.com/ru/post/de463461/


All Articles