www.wikidata.de-de.nina.az
Go auch Golang ist eine kompilierbare Programmiersprache die Nebenlaufigkeit und automatische Speicherbereinigung unterstutzt Entwickelt wurde Go von Mitarbeitern des Unternehmens Google Inc 2 Die Entwurfe stammen von Robert Griesemer Rob Pike und Ken Thompson GoBasisdatenParadigmen nebenlaufig imperativ strukturiert modular objektorientiert generischErscheinungsjahr 2009 erste stabile Version 2012Designer Rob Pike Ken Thompson Robert GriesemerEntwickler Robert Griesemer Rob Pike Ken Thompson u a Aktuelle Version 1 21 4 1 31 Marz 2024 Typisierung stark statischWichtige Implementierungen Gc gccgoBeeinflusst von C Newsqueak Alef Limbo OberonBetriebssystem Linux macOS FreeBSD Windows Fuchsia Experimentell DragonFly BSD Plan 9 Solaris z OSLizenz BSD Lizenzgo dev Inhaltsverzeichnis 1 Uberblick 2 Merkmale und Sprachmittel 3 Syntax 4 Einfache Beispiele 5 Typkonvertierung 6 Zeiger 7 Objektorientierung 8 Nebenlaufigkeit 9 Implementierungen 10 Geschichte 11 Maskottchen 12 Literatur 13 Weblinks 14 EinzelnachweiseUberblick BearbeitenGo wurde aus Unzufriedenheit uber die bestehenden Sprachen zur Softwareentwicklung wie C oder Java im Kontext heutiger Computersysteme insbesondere im Hinblick auf skalierbare Netzwerkdienste Cluster und Cloud Computing entwickelt 3 Im Vergleich zu C hat Go weit weniger Keywords Eines der Probleme das Go losen mochte ist die Compiler Ineffizienz in C und C Wichtige Ziele bei der Entwicklung waren unter anderem die Unterstutzung von Nebenlaufigkeit mit nativen Sprachelementen und die Erleichterung der Softwareentwicklung mit grossen Entwicklerteams und grossen Codebasen 4 Go besitzt einen eigenen Garbage Collector erlaubt die Verwendung von Zeigern verzichtet jedoch auf Zeigerarithmetik 5 Go ist eine kompilierte Sprache bei der Wert auf eine hohe Ubersetzungsgeschwindigkeit gelegt wurde Go orientiert sich syntaktisch an der Programmiersprache C mit einigem Einfluss aus der Wirthschen Sprachfamilie Pascal Modula und insbesondere Oberon Die Unterstutzung fur Nebenlaufigkeit wurde nach Vorbild der von Tony Hoare eingefuhrten Communicating Sequential Processes CSP gestaltet und steht in Tradition der Programmiersprachen Newsqueak Alef und Limbo 6 Merkmale und Sprachmittel BearbeitenGo bietet Closures und Reflexion 7 sowie Typsicherheit und eine automatische Speicherbereinigung Objektorientierung unterstutzt Go durch Interfaces und Mixins Auf Klassen und Vererbung von Klassen wird bewusst verzichtet Ausserdem ist es moglich den Quellcode wie bei Java durch Pakete zu modularisieren Nebenlaufigkeit wird durch Communicating Sequential Processes realisiert die Goroutinen genannt werden und uber Kanale Channels miteinander kommunizieren konnen Generische Typen wurden in Version 1 18 eingefuhrt 8 Unicode wird in Form von UTF 8 unterstutzt sowohl fur Strings als auch fur Variablenbezeichner im Quelltext allerdings nur Unicode Buchstaben und Ziffern Dt t2 t1 ist also moglich 9 Syntax BearbeitenDie Syntax von Go orientiert sich im Wesentlichen an der Syntax der Programmiersprache C weicht davon aber an einigen Stellen ab So kann beispielsweise auf den Abschluss von Anweisungen durch ein Semikolon verzichtet werden Datentypen werden bei Deklarationen hinter den Bezeichner geschrieben statt davor um die Deklaration von Funktionstypen zu vereinfachen 10 Code Blocke werden mit geschweiften Klammern abgegrenzt Neben dem einfachen Gleichheitszeichen als Zuweisungsoperator gibt es zusatzlich den Operator der Deklaration mit Typinferenz und Zuweisung kombiniert Die Sprache umfasst mit 25 Schlusselwortern weniger Schlusselworter als ANSI C Kommentare werden wie in C oder C mit Schragstrichen markiert bis bezeichnet einen Kommentar der auch mehrere Zeilen enthalten kann leitet einen Kommentar bis zum Ende der Zeile ein Jede Quelldatei gehort genau einem Paket an das am Anfang der Datei mit der package Anweisung angegeben wird Das Schlusselwort fur Funktionen lautet func die Funktion main in dem main Paket ist der Einsprungpunkt des Go Programms Funktionen konnen mehrere Werte zuruckgeben Es ist ublich als letzten Ruckgabewert den Status uber den Erfolg oder Misserfolg des Funktionsaufrufs zu ubermitteln und sogleich mit einer bedingten Kontrollstruktur zu uberprufen Jede Variable hat einen definierten Typ Jede Variable mit Ausnahme des Blank identifier muss verwendet werden Der Blank identifier ignoriert eine Zuweisung er ist ein anonymer Platzhalter Die Prufung einer Bedingung in einer Kontrollstruktur wie if for oder switch wird anders als bei anderen Sprachen nicht von Klammern umschlossen Einfache Beispiele Bearbeitenpackage main import fmt func main fmt Println Hallo Welt Das obige Hallo Welt Programm gibt am Ausgabemedium den String Hallo Welt aus Ein weiteres Beispiel berechnet die Kreiszahl Pi naherungsweise uber die Leibniz Reihe Fur die Berechnung werden nichtsequentielle Go Routinen und ein Kanal verwendet package main import fmt math func main fmt Println calcpi 5000 calcpi startet n Goroutinen um eine Naherung von Pi zu berechnen func calcpi n int float64 ch make chan float64 n for k 0 k lt n k alle n Werte nichtsequentiell berechnen go calcsubterm ch float64 k das Ergebnis mit Null initialisieren f float64 0 0 for k 0 k lt n k alle n Werte addieren f lt ch return f func calcsubterm ch chan lt float64 k float64 ch lt 4 math Pow 1 k 2 k 1 Die einzelnen Summanden der mathematischen Reihe werden nichtsequentiell ausgefuhrt und schreiben ihre Ergebnisse jeweils in den Kanal ch Gleichzeitig werden die Werte aus dem Kanal zu einem Gesamtergebnis addiert Am Ausgabegerat erscheint die Ziffernfolge 3 141392653591793 11 Die Abweichung zur eigentlichen Kreiszahl ab der vierten Nachkommastelle ist vor allem auf die langsame Konvergenz der Leibniz Reihe zuruckzufuhren Typkonvertierung BearbeitenAnders als bei der Sprache C mussen Typen immer konvertiert werden Es ist zum Beispiel nicht moglich einen Wert vom Typ Integer in einer Variable vom Typ Float zu speichern ohne den Wert vorher zu konvertieren Im folgenden Beispiel wird eine Variable vom Typ Integer deklariert und der Wert dieser Variable einer anderen Variable vom Typ Float zugewiesen Man beachte dass zwischen int und uint unterschieden wird 8 Bit Unsigned Integer uint8 umfassen einen Bereich von 0 255 wahrend int8 einen Bereich von 128 127 umfassen Diese Vorgehensweise der strikten Typisierung ist sehr sinnvoll da schwer zu findende Programmierfehler so leichter erkannt werden konnen var i int 100 var f float64 float64 i var u uint uint f Sofern bei der Deklaration direkt ein Wert zugewiesen wird ist die explizite Nennung des Typs optional Der Compiler ermittelt ihn anhand des Wertes oder der angegebenen Typenkonverterfunktionen Auf Paketebene muss jede Anweisung mit einem Schlusselwort beginnen deshalb kann die folgende Kurzform nur innerhalb von Funktionen verwendet werden i 100 f float64 i u uint f Zeiger BearbeitenIm Gegensatz zu vielen Hochsprachen wie Java arbeitet die Programmiersprache Go mit Zeigern Ein Zeiger englisch pointer enthalt als Wert die Adresse eines Speicherbereichs Bestimmte Aufgaben konnen ohne Zeiger nicht programmiert werden Dazu gehort die Ubergabe von Werten an Funktionen Call by reference Im folgenden Beispiel wird eine Variable vom Typ Integer mit dem Namen n und dem Wert 100 initialisiert Anschliessend wird die Speicheradresse also die Adresse im Speicher des Computers ausgegeben Die Adresse der Variable n wird also mit amp n abgerufen Der Syntax der Zeiger erinnert stark an die Sprache C var n int 100 fmt Println Die Adresse der Variable amp n Beispiel Ausgabe 0xc000018030 Im nachsten Beispiel wird wieder eine Variable vom Typ Integer mit dem Namen n und dem Wert 100 initialisiert Dann wird eine Pointer Variable vom Typ Integer Zeiger deklariert Der Typ einer Zeiger Variable wird durch einen fuhrenden Asterisk vor dem Variablentyp deklariert Aus int wird int Anschliessend wird die Speicheradresse der Variable n als Wert der Zeiger Variable p deklariert Daraufhin wird jene Adresse des Speichers ausgegeben die von der Variable n belegt wurde Zuletzt wird jener Wert ausgegeben der sich in der Speicheradresse befindet Der Wert einer Speicherstelle der in der Zeiger Variable p deklariert ist kann mit p ermittelt werden var n int 100 var p int amp n Gibt eine Speicheradresse aus z B 0xc000018030 fmt Println Adresse gespeichert in der Zeiger Variable p p Gibt den Wert an der in der Speicheradresse steht 100 fmt Println Wert der Speicheradresse gespeichert in p p Eine Zeiger Adresse ohne gespeicherten Zeiger wird nil pointer genannt Man kann einfach abfragen ob eine Zeigeradresse eine Speicheradresse als Inhalt hat oder nicht if p nil Wenn zutreffend Zeiger Variable speichert einen Zeiger auf einen Speicherbereich if p nil Wenn zutreffend Zeiger Variable speichert keinen Zeiger auf einen Speicherbereich Im letzten Beispiel soll die Verwendung beim Aufruf einer Funktion dargestellt werden Zuerst werden zwei Variablen vom Typ Integer deklariert Der Inhalt dieser zwei Variablen soll getauscht werden package main import fmt func main a 10 b 50 Anzeige vor dem Tausch fmt Println Wert der Variable a a fmt Println Wert der Variable b b Aufruf der Funktion tauschen tauschen amp a amp b Anzeige des Tausches fmt Println Wert der Variable a a fmt Println Wert der Variable b b Funktion tauschen func tauschen a b int tmp a a b b tmp Man kann also grob zusammenfassen dass amp die Speicheradresse einer Variable ermittelt wahrend den gespeicherten Wert einer Speicheradresse ermittelt 12 Objektorientierung BearbeitenGo unterstutzt objektorientierte Programmierung sie ist jedoch nicht klassenbasiert Datentypen konnen in Go Methoden besitzen Polymorphie wird uber Interfaces Schnittstellen erreicht uber die Methodenaufrufe zur Laufzeit an die konkrete Implementierung gebunden werden Dynamische Bindung Fur einen Datentyp muss nicht explizit deklariert werden dass er ein bestimmtes Interface erfullt Diese Beziehung wird stattdessen implizit beim Kompilieren ermittelt um lose Kopplung zu erreichen Statt Vererbung und Typ Hierarchien kommt in Go Komposition zum Einsatz Hierfur unterstutzt Go eine Form von Mixins die in Go embedding Einbettung genannt wird Eine Datenstruktur kann beliebig viele andere Datentypen einbetten sodass sie deren Methoden und Datenfelder erhalt Beispiel zu Typen Interfaces und Mixins package main import fmt Definieren zweier Typen type User struct Name string type Admin struct User Admin bettet zudem den Typ User ein Email string Ein Interface mit der Methode Notify type Notifier interface Notify User und Admin implementieren das Interface Notifier indem sie jeweils eine entsprechende Notify Methode haben Eine vorherige Deklaration zur Implementierung ist nicht notwendig func u User Notify fmt Printf User Sending user email to s n u Name func a Admin Notify fmt Printf Admin Sending admin email to s The email address is q n a Name Verwenden des eingebetteten Feldes Name vom User a Email func main Einen User und einen Admin erstellen user User Name john smith admin Admin User user Email john email com Eine Variable vom Interfacetyp anlegen var n Notifier Die implementierte Notify Methode aufrufen Die Methode wird uber die Interfacevariable aufgerufen Mittels dynamischer Bindung wird die Methode am richtigen Typ aufgerufen n user n Notify n admin n Notify Nebenlaufigkeit BearbeitenZur Unterstutzung der nebenlaufigen Programmierung in Go wird das Konzept der Kanale channels genutzt das eine relativ stark abstrahierte Moglichkeit der synchronen oder asynchronen Kommunikation zwischen Go Routinen bietet Ein Kanal ist dabei ein Speicherbereich der durch Semaphore abgesichert ist und eine Warteschlange buffered asynchronous channel oder lediglich eine Schnittstelle unbuffered synchronous channel zur Verfugung stellt 13 Uber einen Kanal lassen sich dabei nur Daten eines festen Typs ubertragen Hierbei ist jedoch keinerlei Begrenzung hinsichtlich des Typs gegeben auch Channels fur Channels sind denkbar 14 Ein Kanal wird durch den Aufruf make chan i typ i synchron bzw make chan i typ i i grosse i asynchron wenn grosse gt 0 erstellt Anschliessend konnen Go Routinen in den Channel schreiben von ihm lesen und ihn schliessen Bei synchronen Kanalen blockiert ein Lesezugriff bis eine andere Go Routine in den Channel schreibt bzw der Schreibzugriff bis eine andere Routine liest Bei asynchronen Kanalen tritt ein solches Verhalten nur auf wenn der zu lesende Channel leer bzw der zu schreibende Channel voll ist Es gibt in Go keine Beschrankung hinsichtlich der Anzahl an Go Routinen die einen Channel lesen und schreiben Trotz der ausgefeilten Synchronisationsmechanismen kann bei der Benutzung von Channels ein Deadlock auftreten der die Go Laufzeitumgebung veranlasst das Programm zu beenden Eine Go Routine kann uber das select Konstrukt auf mehreren Channels gleichzeitig lauschen bzw versuchen in mehrere Channels zu schreiben wobei dasjenige case Statement ausgefuhrt wird das zuerst nicht mehr blockiert oder es wird im Fall mehrerer Optionen eine pseudozufallige Wahl getroffen Daten werden mit i kanal i lt i Wert i in einen Kanal geschrieben und mit i variable i lt i kanal i gelesen wobei beim Lesen die Variablenzuweisung wegfallen kann Das Lauschen auf einem Channel kann auch mit dem for Konstrukt automatisiert werden wobei die Schleife verlassen wird sobald der Channel geschlossen ist Beispiel package main import fmt func zehnMal kanal chan string Argument empfangen sag lt kanal Zehnmal zuruckschreiben for i 0 i lt 10 i kanal lt sag Kanal schliessen close kanal func main synchronen Kanal offnen kanal make chan string oder make chan string 0 Starten der parallelen Go Routine zehnMal go zehnMal kanal Senden eines Strings kanal lt Hallo Empfangen der Strings bis der Channel geschlossen wird for s range kanal fmt Println s fmt Println Fertig Im Beispiel ruft main die Go Routine zehnMal auf die einen empfangenen String zehnmal uber den gleichen Kanal zuruckgibt und ihn danach schliesst Durch den synchronen Kanal warten die beiden Go Routinen aufeinander sodass main erst in die for Schleife eintritt wenn zehnMal den String empfangen hat Ware der Kanal nicht synchron konnte ein Deadlock auftreten wenn main die geschriebene Variable sofort wieder liest und sie dabei aus dem Puffer entfernt und zehnMal dadurch vergeblich auf sein Argument wartet Wichtig ist auch dass zehnMal nach dem Schreiben der Strings den Kanal schliesst da main sonst die Schleife nicht verlassen kann Implementierungen BearbeitenEs gibt mindestens zwei Compiler fur Go die auf Linux macOS Windows und FreeBSD betrieben werden konnen und die Go 1 Spezifikation vollstandig implementieren Gc ist der offizielle Go Compiler und wurde initial von Ken Thompson in C geschrieben basierte auf der Plan 9 Toolchain und nutzte Yacc Bison zum Parsen Mit Version 1 5 wurde dieser Compiler von C nach Go ubersetzt und ist damit self hosting Ursprunglich bestand der Compiler aus mehreren ausfuhrbaren Kommandos die unterschiedliche Namen je nach Ziel Architektur hatten 8 g fur x86 6 g fur x86 64 5 g fur ARM Mit Version 1 5 wurden sie zu einem einzelnen ausfuhrbaren Kommando zusammengefasst go tool compile und die Ziel Architektur kann uber die Umgebungsvariable GOARCH gewahlt werden Gccgo von Ian Taylor ist ein Go Frontend fur die GNU Compiler Collection GCC Das in C geschriebene Frontend nutzt zum Parsen einen rekursiven Abstieg Die folgenden Backend Schritte sind die der Standard GCC Verarbeitung 15 Durch dieses Vorgehen wird zwar die Kompilierzeit im Vergleich zum Gc Compiler erhoht jedoch ist der produzierte Code effizienter Die GNU Compiler Collection GCC unterstutzt Go 1 mit Version 4 7 1 vollstandig 16 der GNU Debugger gdb unterstutzt Go ab Version 7 5 17 Beide Compiler implementieren eine parallele Mark and Sweep Speicherbereinigung Der offizielle Compiler wird von dem Kommandozeilen Werkzeug go begleitet das als Fassade fur verschiedene Werkzeuge dient wie z B dem Installieren von Paketen aus Quelltext Repositories im Internet wie etwa GitHub oder Google Code go get dem automatischen Formatieren von Quelltext go fmt dem Ausfuhren von Tests go test dem Erzeugen von Dokumentation aus Quelltext Kommentaren go doc oder dem Kompilieren des Projektes go build sodass keinerlei Makefiles notig sind wenn eine empfohlene Verzeichnisstruktur eingehalten wird Geschichte BearbeitenDie Entwurfsphase begann am 21 September 2007 anfangs als 20 Prozent Projekt auf Initiative von Robert Griesemer Rob Pike und Ken Thompson Bald darauf stiessen weitere Entwickler dazu und Go wurde zum Vollzeit Projekt 18 Am 30 Oktober 2009 wurde Go von Rob Pike in einem Google TechTalk prasentiert und die Veroffentlichung als freie Software angekundigt die dann wie angekundigt am 10 November erfolgte 19 20 Seitdem sind zahlreiche Beitrage von Entwicklern aus der Go Community ausserhalb Googles hinzugekommen Am 28 Marz 2012 wurde Version 1 freigegeben 21 Seitdem gelten Sprachspezifikation und Standardbibliothek als stabil und sollen innerhalb der 1 x Serie auf Quelltext Ebene abwartskompatibel bleiben 22 Am 14 Mai 2013 wurde Go 1 1 freigegeben das vor allem Performance Verbesserungen an der Implementierung enthalt 23 Jeweils sechs Monate spater erschienen die Versionen Go 1 2 bis Go 1 10 Vom 24 bis zum 26 April 2014 fand die erste Konferenz zu Go die GopherCon 24 in Denver statt die seitdem jahrlich stattfindet Maskottchen Bearbeiten nbsp Das Gopher Maskottchen von GoDas Go Maskottchen ist eine Taschenratte englisch Gopher Es wurde von Renee French entworfen die auch Glenda das Plan 9 Haschen entworfen hat Das Logo und das Maskottchen stehen unter der Creative Commons Attribution 3 0 Lizenz Literatur BearbeitenAlan A A Donovan Brian W Kernighan The Go Programming Language Pearson Education 2015 ISBN 978 0 13 419044 0 Frank Muller Systemprogrammierung in Google Go Grundlagen Skalierbarkeit Performanz Sicherheit dpunkt verlag Heidelberg 2011 ISBN 978 3 89864 712 0 Rainer Feike Programmierung in Google Go Neuigkeiten von Google in der Systemprogrammierung Addison Wesley Munchen Boston 2010 ISBN 978 3 8273 3009 3 Caleb Doxsey An Introduction to Programming in Go 2012 ISBN 978 1 4783 5582 3 englisch golang book com Andreas Schropfer Go Das Praxisbuch dpunkt verlag 2020 ISBN 978 3 86490 713 5 Kristian Kohler Microservices mit Go Rheinwerk Verlag 2020 ISBN 978 3 8362 7559 0 Weblinks BearbeitenOffizielle Website englisch Spezifikation englisch Eine interaktive Einfuhrungs Tour englisch Ubersetzungen deutsch Sprachbeschreibung usw Go at Google Language Design in the Service of Software Engineering Artikel von Rob Pike uber das Sprachdesign englisch Vortrag von Rob Pike vom 30 Oktober 2009 Prasentationsfolien PDF 242 kB Programmieren mit Go ADMIN Magazin Go by example englisch Der Golang Spicker kompakte Ubersicht deutsch Einzelnachweise Bearbeiten Release History Google go language Why Learn Go Kurzinterview mit Rob Pike Video englisch Go at Google Language Design in the Service of Software Engineering go dev FAQ Eintrag zu Zeigerarithmetik Origins of Go s Concurrency Model Golem de Artikel Go schnelle Programmiersprache von Google go dev FAQ Eintrag zu Generics Abgerufen am 17 Marz 2022 go dev FAQ Eintrag zu Unicode Bezeichnern go dev Blogeintrag zu Syntax fur Deklarationen Berechnung von Pi auf dem Go Playground Beispiel zur nichtsequentiellen Berechnung von Pi A Tour Of Go Pointers go dev Effective Go Channels go dev Effective Go Channels of channels go dev Haufig gestellte Fragen zur Implementierung GCC 4 7 Release Series Changes New Features and Fixes GDB 7 5 Release Notes Informationen zur Geschichte in offizieller FAQ ursprungliche Nachricht uber die Veroffentlichung im Google Open Source Blog iX Artikel vom 11 November 2009 go dev Go version 1 is released go dev Go 1 and the Future of Go Programs go dev Go 1 1 is released GopherCon Programmiersprachen von Google Go Dart Carbon Normdaten Sachbegriff GND 7725033 3 lobid OGND AKS LCCN sh2012000746 Abgerufen von https de wikipedia org w index php title Go Programmiersprache amp oldid 235237211