© Artram/Shutterstock.com
Lohnt sich als C#-Entwicklerin oder -Entwickler ein Blick auf Go?

Go, der C#-Killer?


Es hat sich herumgesprochen, dass wichtige Plattformen wie Docker und Kubernetes mit der Programmiersprache Go geschrieben sind. Kein Wunder, dass viele Entwicklerinnen und Entwickler neugierig geworden sind. In der Stack Overflow Survey 2019 landete Go auf der Liste der populärsten Entwicklungstechnologien auf Platz 13 und damit vor namhaften Sprachen wie Swift, Kotlin oder Dart. In der Rangliste der beliebtesten Sprachen erreicht Go Platz 9 und liegt damit sogar knapp vor C#.

Ist es also an der Zeit, C# an den Nagel zu hängen und sich neu zu orientieren? Nein, Go ist kein C#-Killer. Go ist aber auf jeden Fall eine interessante Alternative zu C# auf dem Server. In diesem Artikel werfe ich einen Blick auf Go aus meiner Sicht als Entwickler, der seit Jahren C# nutzt und gern hat.

Wie lernt man Go?

Eine komplette Einführung in Go ist in einem Magazinartikel unmöglich, das soll erst gar nicht versucht werden. Dieser Artikel soll grundlegende Unterschiede und Gemeinsamkeiten zwischen C# und Go aufzeigen. Außerdem soll er durch ein paar Codebeispiele einen Eindruck davon vermitteln, wie sich Go anfühlt. Wer neugierig geworden ist und mehr wissen möchte, sollte einen Blick auf Go by Example [1] werfen. Dort wird Go anhand vieler kleiner Beispiele erklärt. Wer noch tiefer einsteigen möchte, dem empfehle ich die Go-Dokumentation [2], zum erfolgreichen Starten insbesondere den Artikel „Effective Go“ und die FAQ-Liste.

Natürlich stellt sich für Personen, die in Go einsteigen, auch die Frage nach der Entwicklungsumgebung. Wenn man von C# kommt, liegt Visual Studio Code mit der Go Extension [3] auf der Hand. Viele .NET-Entwicklungsteams schätzen auch die Tools aus dem Hause JetBrains. Mit GoLand hat die Firma eine IDE für Go im Angebot, die im Gegensatz zu Visual Studio Code kostenpflichtig ist. Für Open-Source-Projekte, Schüler, Lehrer, User Groups etc. ist GoLand aber kostenlos.

Grundphilosophie: Code einfach halten

Entwicklungsteams mit C#-Hintergrund wird beim ersten Blick auf Go auffallen, wie reduziert die Sprache und auch das Tooling im Vergleich zu C# sind. So stehen beispielsweise den in C# über hundert Schlüsselwörtern in Go gerade einmal 25 gegenüber. Dieser erste Eindruck täuscht nicht. Die Sprache und den damit erstellten Code einfach und einheitlich zu halten, ist ein wichtiges Designziel von Go. Die Dokumentation des Speichermodells von Go [4] beginnt beispielsweise mit nur drei Zeilen und bevor im Anschluss alle Details erklärt werden, folgt der Hinweis: „If you must read the rest of this document to understand the behavior of your program, you are being too clever. Don’t be clever.“ Go kommt mit einem Tool zum Codeformatieren, das auch Visual Studio Code verwendet. Es hat genau keine Settings. Die Community erwartet, dass jeder Go-Code gleich aussieht, egal woher er kommt. „The output of the current gofmt is what your code should look like, no ifs or buts“ [5]. Willkommen in der Denkweise von Go.

Man kann einwenden, dass die Einfachheit daher kommt, dass Go jünger als C# ist. Go kam Ende 2009 heraus, die erste Version von C# sieben Jahr davor. Das ist aber nicht der alleinige Grund. Die relativ gemächliche Weiterentwicklung (nach zehn Jahren ist die Version 2 der Sprache gerade erst in der Designphase), der Prozess des ausführlichen Abwägens von Vorteilen hinzugefügter Komplexität bei Spracherweiterungen, die Kultur der offenen Diskussion bei neuen Sprachfunktionen, all das unterstreicht, dass Stabilität und Einfachheit Designprinzipien der Sprache Go sind. Der Vorteil, den Entwicklungsteams davon haben, ist, dass Go leicht zu erlernen und Go-Code relativ leicht zu lesen und zu warten ist, entsprechende generelle Informatikkenntnisse vorausgesetzt. In Zeiten von Open Source und Microservices sind das wichtige Eigenschaften einer Sprache, da häufig viele verschiedene Personen im Lauf der Zeit mit dem Code einer Softwarelösung zu tun haben.

Limits

Die Kehrseite der Medaille ist, dass Go im Vergleich zu C# viele Funktionen fehlen. Keine Klassen und Vererbung? Keine Generics? Fehlerbehandlung ohne try-catch-Blöcke? Das lässt einen erst einmal den Kopf schütteln, wenn man von C# kommt. Manche dieser Dinge (z. B. Klassen, Vererbung) gibt es in Go bewusst nicht. Die Sprache hat andere Lösungsansätze für die zugrunde liegenden Herausforderungen. Listing 1 stellt einige dieser Ansätze an einem kleinen kommentierten Codebeispiel vor. Andere Dinge (z. B. Generics) sind in Go schlicht und einfach noch nicht fertig. Das sieht man aber nicht als Katastrophe, im Gegenteil. Es gibt Designs und experimentelle Implementierungen, die über Jahre diskutiert, ausprobiert und oft auch wieder verworfen werden. Lieber ein paar Jahre ein paar zusätzliche Zeilen Code schreiben als eine schlechte Lösung übers Knie brechen.

Listing 1: Struct und Interface

// Play with this code snippet online at https://play.golang.org/p/37kbcROPsZz package main import ( "fmt" "math" ) // Let us define two simple structs. In contrast to C#, there are no classes. // Everything is a struct. Note that this does not say anything about allocation // on stack or heap. The compiler will decide for you whether to allocate an // instance of a struct on the stack or heap based on *escape analysis* // See also https://en.wikipedia.org/wiki/Escape_analysis. // ... and yes, dear C# developer, you can believe your eyes: // No semicolons at the end of lines in Go ;-) type Point struct { X, Y float64 } type Rect struct { LeftUpper, RightLower Point } type Circle struct { Center Point Radius float64 } // Now let us add some functions to our structs func (r Rect) Width() float64 { return ...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang