Suchen

Definition „Go (Programmiersprache)“ Was ist Go?

Autor / Redakteur: chrissikraus / Stephan Augsten

Die Programmiersprache Go wurde von Google-Mitarbeitern mit Fokus auf Systemprogrammierung entworfen. Moderne Ansätze wie Nebenläufigkeit und Garbage Collector führen dabei zu einer besonders guten Performance.

Firma zum Thema

Go wurde von Google-Mitarbeitern erdacht, der Go Gopher als Maskottchen geht auf Renee French zurück.
Go wurde von Google-Mitarbeitern erdacht, der Go Gopher als Maskottchen geht auf Renee French zurück.
(Bild: fiveyears.jpg / fiveyears.jpg / Renee French / CC BY 3.0 / CC BY 3.0)

Go ist eine Open Source Programmiersprache mit statischer Typisierung, die ihre besonderen Stärken in Nebenläufigkeit und Parallelisierung, also der parallelen Abarbeitung mehrerer Befehle, ausspielen kann. Die Sprache wurde von Google-Mitarbeitern entwickelt; 2009 wurde die erste stabile Version veröffentlicht.

Ursprünglich für die Systemprogrammierung entworfen, sollte Go technischen Neuerungen und modernen Anforderungen gerecht werden, zum Beispiel Mehrkernprozessoren oder skalierbare Systeme im Cloud-Umfeld. Die Sprache will Komfort während der Entwicklung mit Effizienz beim Kompilieren und Ausführen des Codes vereinen – eine Kombination, die bei gängigen Systemprogrammiersprachen wie C und C++ in der Form nicht existiert.

An C orientiert

Go ähnelt in der Syntax stark der Programmiersprache C, führt aber einige Neuerungen ein. Sie sollen die Arbeit mit Go effizienter gestalten und den Code besser lesbar machen. Statements müssen zum Beispiel nicht mit einem Semikolon abgeschlossen werden und es gibt nur 25 reservierte Schlüsselwörter.

Klassen existieren in Go nicht. Über Interfaces und Strukturen können jedoch eigene Typen definiert werden, mit denen sich objektorientiert arbeiten lässt. Auch Polymorphie mit dynamischer Bindung ist möglich.

Es wurde besonders viel Wert darauf gelegt, das Kompilieren so effizient wie möglich zu gestalten – die langsame Übersetzungsgeschwindigkeit von C / C++ ist gerade bei großen Projekten ein häufiger Kritikpunkt. Zudem bietet Go einen Garbage Collector, also eine automatische Speicherbereinigung.

Nebenläufigkeit mit Go

Go unterstützt Nebenläufigkeit, kann also mehrere Prozesse parallel und voneinander unabhängig behandeln. Das geschieht mit sogenannten Goroutinen: Schreibt man das Schlüsselwort „go“ vor Funktions- oder Methodenaufrufe, werden diese zur Laufzeit parallel abgearbeitet. Goroutinen sind keine Threads, sondern Koroutinen.

In einem einzigen Thread können demzufolge viele Goroutinen ausgeführt werden; erst, wenn eine Goroutine ihren Thread blockiert, werden die übrigen Routinen in einen neuen Thread ausgelagert. Die Routinen sind sehr kompakt und belegen nur so viel Speicher, wie sie tatsächlich für die Abarbeitung ihrer jeweiligen Aufgaben benötigen.

Kommunikation zwischen Goroutinen

Go ermöglicht die Kommunikation zwischen Routinen mittels Channels. Das Schlüsselwort „chan“ signalisiert einen Channel. Den Typen wählt man passend zur Information, die übergeben werden soll. Während eine Goroutine auf die Information aus einem Channel wartet, pausiert sie die weitere Ausführung ihrer Anweisungen.

Gleiches gilt für das Senden von Informationen per Channels. So kann man zum Beispiel voneinander abhängige Berechnungen in der korrekten Reihenfolge ausführen lassen oder, ganz allgemein gesagt, bestimmte Abläufe synchronisieren. Zudem lässt sich festlegen, ob ein Channel Informationen empfangen oder senden soll.

Channels können mit Routinen geschickt kombiniert werden, zum Beispiel zu Pipelines, die Informationsfluss und Hardwarenutzung optimieren. Da in Go auch die main-Funktion eine Goroutine ist, kann hier ebenfalls mit Channels gearbeitet werden.

Wettlaufsituationen erkennen und vermeiden

Wettlaufsituationen oder Data Race Conditions können bei nebenläufiger Programmierung auftreten, wenn mehrere Prozesse denselben Wert verändern sollen, das Ergebnis aber von der Reihenfolge der Abarbeitung abhängt. Sie verursachen oft Fehler, die nur schwer zu lokalisieren sind.

Go verfügt über ein Tool, mit dem sich Goroutinen mit dem Potenzial für Data Race Conditions aufspüren lassen. Die gefundenen Konstellationen lassen sich dann zum Beispiel über Channels oder Mutex auflösen. Außerdem kennt Go Waitgroups, mit denen man ebenfalls Prozesse synchronisieren kann.

(ID:45446678)