• IT-Karriere:
  • Services:

Go hat Zeiger

Aus C hat Go das Konzept der Zeiger übernommen. Diese speziellen Variablen merken sich die Speicheradresse eines Wertes. Übergibt man einer Funktion einen solchen Zeiger (Call by Reference), kann sie direkt den an dieser Speicheradresse abgelegten Wert ändern.

Stellenmarkt
  1. Transdev Vertrieb GmbH, Leipzig
  2. Webasto Group, Stockdorf bei München

Im unten stehenden Beispiel tauscht die Funktion swap() die Inhalte der Variablen a und b. Die Funktion bekommt zwei Zeiger übergeben, die jeweils auf einen Ganzzahlwert zeigen. In der Funktion steht dann *p1 für den Wert, auf den p1 zeigt.

Das & liefert einen Zeiger auf den Inhalt der entsprechenden Variablen. Anders als C bietet Go allerdings keine Zeigerarithmetik an.

  1. var a int = 1
  2. var b int = 2
  3.  
  4. func swap(p1 *int, p2 *int) {
  5. var temp int
  6. temp = *p1
  7. *p1 = *p2
  8. *p2 = temp
  9. }
  10.  
  11. swap(&a, &b)

Klassenlos objektiv

Go ist zwar eine objektorientierte Sprache, verzichtet jedoch auf Klassen und Vererbung. Stattdessen existieren nur Structs, die mehrere Werte zusammenfassen. Ein Punkt besteht beispielsweise aus zwei Integer-Werten:

  1. type Point struct {
  2. x int
  3. y int
  4. }
  5.  
  6. var p Point = Point { 1,2 }

Die Klammernotation erzeugt einen konkreten Point, an dessen Elemente man anschließend über die Punktnotation p.x gelangt. Methoden kann man den Structs einfach nach Belieben hinzufügen:

  1. func (p Point) Print() {
  2. fmt.Printf("%d, %d\n", p.x, p.y)
  3. }

Die Angabe in den Klammern hinter dem Schlüsselwort func verrät, zu welchem Datentyp die jeweilige Methode gehört. Go bezeichnet diese Angabe als Receiver Argument. Innerhalb der Funktion sind das Struct und seine Werte dann unter dem angegebenen Namen verfügbar - im Beispiel etwa der Punkt unter dem Namen p. Diese Notation ohne Klassen hat den Vorteil, dass auch nachträglich einfach eine Methode auf eine Struct implementiert werden kann.

Im obigen Beispiel gibt übrigens fmt.Printf() die im Punkt gespeicherten Werte aus. Die Syntax orientiert sich dabei an printf() aus C: Anstelle der Platzhalter %d baut die Funktion die Werte von p.x und p.y ein.

Interfaces

Polymorphismus erreicht Go über Interfaces, wie sie unter anderem auch Java kennt. Interfaces geben eine Liste mit Methoden vor, die dann für ausgewählte Structs implementiert werden:

  1. type Debug interface {
  2. Print()
  3. }

Bietet eine Struct die Methode Print() an, erfüllt sie automatisch das Interface Debug. Damit lässt sich eine Variable für das Interface anlegen. Die kann dann wiederum alle Objekte speichern, die das Interface implementieren. Im Beispiel erfüllt Point das Interface Debug:

  1. func main() {
  2. var a Debug
  3. p := Point{ 1,2,3 }
  4.  
  5. // p implementiert das Debug-Interface:
  6. a = p
  7. a.Print()
  8. }

Nebenläufigkeit

Stellt man einer Funktion das Schlüsselwort go voran, führt sie Go automatisch nebenläufig aus:

  1. go berechnewas()

Diese sogenannten Goroutinen kommunizieren über Kanäle (Channels) miteinander, die wie Warteschlangen funktionieren. Einen neuen Channel muss man vor seiner Benutzung erstellen und dabei den Typ der über den Kanal ausgetauschten Daten festlegen. Im folgenden Beispiel könnten die Goroutinen über den Channel Integerzahlen austauschen:

  1. kanal := make(chan int, 100)

Die Zahl gibt die Größe der Warteschlange an. Bei einer 0 entsteht ein synchroner Channel. Dieser blockiert eine Goroutine so lange, bis eine andere aus dem Kanal liest oder schreibt. Eine Goroutine kann mehrere Channels gleichzeitig nutzen. Für den Zugriff auf einen Channel existiert die Notation:

  1. kanal <- 25
  2. ausgabe := <- kanal

Der erste Befehl schiebt die 25 in den Channel, der zweite holt die 25 wieder heraus und speichert sie in der Variablen ausgabe. Die Goroutinen und das Channel-System verhindern allerdings keine Race Conditions. Zwei Goroutinen könnten sich folglich gegenseitig blockieren. Seit der Go-Version 1.14 lassen sich Goroutinen jedoch asynchron unterbrechen.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Programmiersprache Go: Schlanke Syntax, schneller CompilerQuellcode kann als Packages gruppiert werden 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6.  


Anzeige
Spiele-Angebote
  1. 16,99€
  2. 59,99€

pengpong 13. Aug 2020 / Themenstart

Ein bischen spät zu der Party... aber egal ;) In deinem Beispiel würde ich aber in Go...

Butterkeks 06. Aug 2020 / Themenstart

Ja, aber was ich damit ausdrücken wollte, ist, dass unsere Welt nicht besser wäre, wenn...

BlackSuit 05. Aug 2020 / Themenstart

Offensichtlich willst du den Punkt nicht verstehen. Und natürlich je mehr Maps desto...

\pub\bash0r 05. Aug 2020 / Themenstart

Nein, aber das würde auch nicht passen, da du Interfaces in Go nicht so verwendest. In...

kieleich 04. Aug 2020 / Themenstart

Sind die mittlerweile wieder kleiner geworden? Also ich bin bei Go vor ein paar Jahren...

Kommentieren


Folgen Sie uns
       


    •  /