go bzw golang auf der Raspberry

  • Das funktioniert perfekt :bravo2:


    Ich arbeite mich gerade beruflich bedingt in go ein und habe auch eben mal auch ein kleines go Programm RESTAPiServer für raspiBackup zum Laufen gebracht. Ehrlich gesagt trauere ich Python etwas nach. Aber go ist in eine auf C basierende Progammiersprache die aus den Erfahrungen aus den Nachteilen von C gelernt hat. Sie ist wie C static typed - was schon gewisse Vorteile beim Entwickeln bringt - aber auch Nachteile :( Auch sonst ein paar sehr spezifische Eigenheiten - z.B. wird kein OO unterstützt (go ist kein C++ !) . Composition ist die Wahl in go zu Inheritance


    Die gewohnten Python Sprachkonstrukte müssen anders implementiert werden - es geht aber natürlich auch - eben nur anders und ungewohnt.


    Sehr schnell stellt man fest dass go von Google kommt: Alles in der Sprache ist internetaffin und ein einfacher Webserver ist in 50 Zeilen und ein Webclient ist in 5 Zeilen geschrieben :thumbs1:


    Anyhow: Go als Programmiersprache auf der Raspberry ist ungewöhnlich. Ich würde aber durchaus mal ein kleines Tutorial dazu erstellen - vorausgesetzt es besteht größeres Interesse :shy:


    EDIT: Anbei wie angeregt ein Inhaltsverzeichnis der verschiedenen zu go behandelten Themen:


    1) Installation von go auf der Raspberry
    2) Kleines Blinkprogramm als Appetizer
    3) Verschiedene Syntaxkonstrukte - Highlow Spiel
    4) Test von Programmen - Fibonaccizahlenberechnung
    5) Beispiel für HTTP Cllient und REST calls - Sonnenauf- und Untergangsberechnung
    6) Typen
    7) Sicherer Httpserver mit ssl
    8)Methoden
    9) Interfaces
    10) Templates - HighlowWebServer
    11)go routines - Parallele Ausführung, Resourcenkonflikte und Synchoronisation am Beispiel der denkenden Philosophen
    12) OT: HighLowServer in der Cloud - Deployed auf Blumix
    13) Benutzung von sql


    Ein Tipp noch: Wenn man im Netz nach irgendwelchen go Dingen sucht sollte man immer golang als Stichwort zufügen ;)

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().

  • Hallo,


    Go ist ja (ähnlich wie Rust) als "C in modern" entwickelt worden, sprich mit Hinblick auf Nebenläufigkeit und einen besseren Speicherverwaltung.


    Wenn man von eine high-level Sprache kommt (wie z.B. Python) ist Go (und auch Rust) natürlich gewöhnungsbedürftig, weil man mehr Schreiben muss. In der "Linux User & Developer" war letzte Jahr ja auch eine Artikelserie zur Programmierung in Go - aber ich denke, dass man als Hobby-Programmierer (egal als Raspi oder ein "normaler" PC) mit einer high-level Sprache besser zurecht kommt und bedient ist.
    Zumal Go ja auch in der Tat eher auf performante Serveranwendung also die typischen Pi-Anwendungen abzielt.


    Was dich natürlich nicht davon abhalten soll, ein Go-Tutorial zu schreiben :-)


    Gruß, noisefloor


  • ...Go ist ja (ähnlich wie Rust) als "C in modern" entwickelt worden, sprich mit Hinblick auf Nebenläufigkeit und einen besseren Speicherverwaltung...

    C ist mir auch bekannt und da hat go wirklich ein paar sehr gute Verbesserungen. Die Pointer sind wirklich typisiert und es gibt Gabagecollection. Auch sind Arrays wesentlich flexibler und typisiert. Weiterhin ist Parallelausführung (goroutines) sowie die Synchronisation zwischen den Prozessen viel einfacher.
    Aber die Syntax ist ziemlich anders als man es gewohnt ist. Das ist nicht die erste neue Programmiersprache die ich lernen musste aber bei keiner dauerte es so lange bis ich halbwegs mit der Syntax vertaut war.

    Quote

    ...Was dich natürlich nicht davon abhalten soll, ein Go-Tutorial zu schreiben :-)...


    Momentan habe ich sowieso keine Zeit für ein Tutprial. Ist mal so eine Frage in's Forum :) Ich sehe mal in ein paar Monaten wenn ich mich mit go habwegs bewegen kann hier wieder nach wieviele Leute Interesse haben und entscheide dann.

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


  • Hallo Framp,



    Momentan habe ich sowieso keine Zeit für ein Tutprial. Ist mal so eine Frage in's Forum :) Ich sehe mal in ein paar Monaten wenn ich mich mit go habwegs bewegen kann hier wieder nach wieviele Leute Interesse haben und entscheide dann.


    Unterschätze mal nicht die Zeit, die man braucht, um ein gutes Tutorial zu schreiben. Ich spreche da mit meinen Icon-Tutorials aus Erfahrung. So ein Einstiegsskript (Installation, Konfiguration, Befehle, Funktionen, Operatoren, Besonderheiten) lässt sich auf vielleicht 20 Seiten bringen. Damit ist aber keinem geholfen. Dem Einsteiger nicht, weil zuviel fehlt. Dem Anwender nicht, weil es ihm auch nur den Einstieg ermöglicht. Und nur "Special features" zu bringen, die Go von anderen (Dir) bekannten Programmiersprachen abhebt, hilft auch niemandem.



    Wenn ich nochmals entscheiden müsste, ob ich diese Tutorial-Reihe starten sollte und damals (2013) den Aufwand hätte abschätzen können, ich glaube ich hätte es nicht angefangen. Momentan sind 31 Teile in Deutsch veröffentlicht und ca. 24 in Englisch erstellt. 19 weitere Teile sind in unterschiedlichen Phasen der Erstellung (von fertig bis blanke Konzeption). Wobei das für mich aktuell keinerlei Priorität (mehr) genießt. Aber ganz sicher werden mit den 50 Teilen die 1000 Seiten geknackt werden.



    Wenn ich andererseits bedenke, was ich unmittelbar nach den ersten Tutorial-Teilen ohne größere Anstrengung an Entwicklungs-, Beratungs- und Validierungsaufträgen seit 2013 erhalten habe oder seitdem an Positionen und Funktionen in diversen Konzernen bekleidet habe, dann hat es sich finanziell schon irgendwie "rendiert". Für mich ist da mittlerweile auch ein Nachschlagewerk entstanden, dass ich mehr und mehr der Standard-Literatur vorziehe. Von den "Code-Snippets" mal ganz abgesehen, durch die per Knopfdruck / Menüauswahl fehlerfreie Blöcke eingefügt werden.



    Bedenke aber auch, dass Du wesentlich tiefer in die Materie einsteigen musst, wenn Du Wissen vermitteln willst, als wenn Du "nur programmieren" möchtest. Ich habe diese Problematik momentan mit ARM-Assembler. Ich habe da eine GPIO-Library geschrieben, die von der Geschwindigkeit mittlerweile konkurrenzlos ist - aber mir fehlen die Worte, um das im Rahmen der Turorial-Reihe vorzustellen. Momentan kann ich nur sagen, hier ist die Datei, so wird's aufgerufen. Und der Benchmark-Test spuckt die und die Zahlen aus. "Konkurrenzprodukte" sind n * 10% langsamer.



    Und ein Tutorial, dass sich nicht am Wissen "ground zero" orientiert, bringt bei einer neuen Programmiersprache wenig. Ebenso wenig bringt ein Vergleich mit C oder Python auf Niveau von C- / Python-Cracks, um Seiten / Zeit zu sparen.


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Andreas,


    das Tutorial soll keine Doktorarbeit werden :lol: - aber Du hast schon Recht: Es ist Aufwand den ich auch nur spendieren werde wenn es eine ausreichende Anzahl von Interessenten gibt.


    Mir schwebt vor die Installation, Konfiguration von go auf der Raspi zu beschreiben und ein kleines Beispielprogramm zu starten. Ziel ist es dabei nicht go als Sprache mit all seinen Fähigkeiten vorzustellen. Da gibt es genug Quellen im Netz wie auch Bücher. Ziel ist dass jeder Interessierte mal eben go installieren kann, es konfiguriert (ist auch nicht ganz ohne ...) und dann ein Demoprogramm laufen lässt.


    Da man sehr leicht mit go Programme aus Repos installieren kann beschränkt sich der Aufwand auf das Testen, Schreiben und das Erstellen den Demoprogramms. Vermutlich werde ich da auch ein paar spezielle Konzepte von go abdecken und nicht nur ein 'Hello world' erstellen.

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


  • Die Menge der Interessierten ist für ein Tutorial zu klein. Kann ich ehrlich gesagt auch verstehen. Bis vor einem Monat hätte mich go im Allgemeinen und speziell auf der Raspi nicht interessiert. Python ist dort meine Wahl.


    Was haltet Ihr von folgendem Vorschlag?


    Ich betrachte diesen Thread als Blog. Sofern ich Zeit habe und mal wieder was Neues über go gelernt habe erstelle ich einen neuen Beitrag. Der erste Beitrag wird dann beschreiben wie man go auf der Raspi installiert. Danach habe ich vor immer wieder Beispielcode zu erstellen und die wesentlichen Dinge darin zu erklären. Den Code lege ich auf Github ab und er läßt sich dann mit go sehr leicht downloaden und ausführen.


    Wer dann rumspielen will mit dem Code muss entweder den go Playgound benutzen oder auf einem anderen Rechner atom sowie das go-plus Paket installieren. Leider läuft atom nicht auf der Raspi =(


    Ich setze gute Python und/oder C Programmierkenntnisse oder aehnliche Programmierkenntnisse voraus.


    Was haltet Ihr von meinem Vorschlag?


    EDIT: Links zum Atom und go-plus Paket zugefügt. Thanks DS :-)

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().

  • Hallo Framp,



    Was haltet Ihr von meinem Vorschlag?


    Fang doch einfach mal an - so nach dem Motto "Der Weg ist das Ziel!"


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Bin schon dabei :-) Betrachtet das hier einfach mal als interaktiven Blog. Ihr bestimmt mit Eurem Feedback wo es langgeht :D

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


  • Dann legen wir mal den Grundstein:


    Installation von go auf der Raspberry und Ausführen von einem Beispielprogramm


    1) Download des go Pakets der ARM Architectur von hier

    Code
    curl 'https://storage.googleapis.com/golang/go1.8.linux-armv6l.tar.gz' -o 'go1.8.linux-armv6l.tar.gz' -L


    2) Extrakt des Archives

    Code
    sudo tar -C /usr/local -xzf go1.8.linux-armv6l.tar.gz


    3) Anlegen eines go Workspaces

    Code
    mkdir -p ~/go/{src,pkg,bin}


    4) Zufügen von verschiedenen go spezifischen Variablen in den Pfad bzw deren Definition. Folgende Zeilen sollte in ~/.profile oder ~/.bashrc aufgenommen werden

    Code
    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=~/go
    export GOBIN=~/go/bin
    export PATH=$PATH:$GOBIN


    5) Prüfen ob alles soweit korrekt aufgesetzt wurde. Wichtig sind GOPATH und GOBIN.


    6) Tutorial code downloaden

    Code
    mkdir -p $GOPATH/src/github.com/framps; cd !$; git clone https://github.com/framps/golang_tutorial.git


    7) Der Verzeichnisbaum unter $GOPATH sollte dann etwa wie folgt aussehen:


    8) Beispielprogramm laufen lassen

    Code
    cd golang_tutorial/helloWorld; go run helloWorld.go


    Glückwunsch! Das erste go Programm lief auf Deiner Raspi :-)


    9)Wer das kleine Programm als ausführbare Datei in $GOPATH/bin haben möchte kann es mit

    Code
    cd golang_tutorial/helloWorld; go install helloWorld.go


    erzeugen und dann mit

    Code
    helloWorld

    aufrufen.


    10) Wer schon go Code mit GPIO Benutzung sehen will

    Code
    go get github.com/stianeikeland/go-rpio

    oder auch für Beaglebone und Odroid

    Code
    go get github.com/mrmorphic/hwio


    Für jeden weiteren Beitrag werde ich weitere Beispielprogramme in das Git Repo reinstellen. Mit

    Code
    git pull

    bekommt man immer den neuesten Stand. Wer will kann ja auch einen Fork des Repos bei sich erstellen und seine eigenen kleinen Programme per PR für alle anderen Mitleser bereitstellen. Dazu bitte ein Unterverzeichnis mit Eurem Forumsnamen o.ä. erstellen.


    Wer mit dem Code spielen will bzw neuen Code zum Spielen und Testen erzeugen will kann das natuerlich auf der Raspberry mit dem Editor seiner Wahl tun. Ich empfehle aber dringend Atom mit dem go-plus Plugin auf einem anderen Rechner zu benutzen. Dann ist es auch sinnvoll auf diesem Rechner go zu installieren. Die obige Anleitung kann dann sinngemaess angewandt werden. Die go Syntax ist zu Anfang sehr ungewohnt und der Compiler schreibt auch nicht immer sehr hilfreiche Fehlermeldungen so dass es sehr hilfreich ist einen Editor zu haben, der einen auf Syntaxfehler schon beim Editieren hinweist ;-)

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().

  • Wer schon mal seine LEDs an der Raspi blinken lassen will kann das kleine Blinkprogramm pullen und mit

    Code
    go get -d ./...
    go build blinkAllLEDs.go
    sudo ./blinkAllLEDs

    starten :lol:


    Da ist im hwio Paket ein kleiner Bug mit GPIO27. Ich habe schon einen PR erstellt.

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().

  • Eben habe ich ein kleines high/low Beispielprogramm in meinem repo pushed. Es werden darin verschiedene Syntaxkonstrukte benutzt und erklärt.


    Primäre Unterschiede zu C:


    1) Es können mehrere Ergebnisse von einer Funktion zurückgegeben werden. Primär wird das dazu in go genutzt um zusaetzlich Fehler zurückzumelden.
    [code=php]actualValue, err = strconv.Atoi(strings.TrimSpace(text))[/php]


    2) Ein switch Statement benötigt kein break in seinen case Zeilen. Ein break ist der Standard. Will man das C bekannte Verhalten muss man das Statement fallthrough am Ende vom case zufügen
    [code=php]switch actualValue > guessValue { // switch
    case true:
    high = actualValue // no break needed because this is standard
    case false:
    low = actualValue
    }[/php]


    3) Alle Variablen werden auf wohldefiniert Werte initialisiert. int -> 0, Pointer -> nil, bool -> false, ...
    [code=php]// variable definitions
    var (
    high = highLimit // type int derived from constant
    low = lowLimit
    actualValue int // ints are initialized with 0
    err error // pointers are initialized with nil
    guessValue = rand.Intn(high-low+1) + low //
    guesses int // ints are initialized with 0
    )[/php]


    4) _ ist eine unbenamste Variable und dient dazu nicht gewünschte oder benötigte Returnwerte zu ignorieren.
    [code=php]text, _ := reader.ReadString('\n')[/php]


    5) Der := Operator ist eine implizite Variablendeklaration und der Typ wird durch die rechte Seite des Operator bestimmt. Dadurch kann man sehr leicht irgendwelche kurzlebigen Variablen an ihrer Benutzungsstelle erzeugen.
    [code=php]reader := bufio.NewReader(os.Stdin) // read from console, variable reader is implicitely defined[/php]

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().

  • Heute habe ich mal eine kleine Standardaufgabe für jeden Informatikstudenten als Beispiel benutzt um es in go zu implementieren. Primär geht es darum wie Funktionen definiert werden sowie Packages und automatisierten Test (Methoden kommen später ;) )


    Die Lösung findet sich hier.


    Im Beispiel habe ich mal die Grenze zur Berechnung der Werte auf 10 gesetzt um dann zu zeigen wie man den zweiten Ergebniswert benutzen kann um Fehler rückzumelden. Typisches go Pattern: Returne das Ergebnis in einer Funktion und der zweite Wert meldet eventuelle Fehler. Exceptions gibt es in go nicht.


    Pakete sind eine Sichtbarkeitsgrenze von Variablen und Funktionen. Alles was mit einem Grossbuchstaben anfängt ist von aussen sichtbar. Alles andere ist nur von den Dateien möglich, die im selben Packet sind. Damit kann z.B. auch ein Testprogramm auf interne Variablen und Funktionen zugreifen.


    Ein Testprogramm endet immer mit _test.go und wird mit

    Code
    go test ./fibonacci

    gestartet und siegt dann z.B. so aus:


    Interessant ist der sog. tableDriven Test:
    [code=php]// table drivern test - usual test pattern in go
    var fibonacciTests = []struct {
    input int // function input
    expected int // expected result
    err bool // should create error
    }{
    {-2, 0, false}, // should be true, used to force test error to show up
    {-1, 0, true},
    {1, 1, false},
    {2, 1, false},
    {3, 2, false},
    {4, 3, false},
    {5, 5, false},
    {6, 8, false},
    {7, 13, false},
    {8, 20, false}, // should be 21 instead of 20, used to force test error to show up
    {11, 0, false}, // should be true, used to force test error to show up
    }[/php]


    In einer Tabelle werden der Eingabewert sowie der erwartete Wert und ob ein Fehler auftreten muss oder nicht definiert und dann später in der Testschleife getestet. Für -2, 8 und 11 habe ich absichtlich die erwarteten Werte falsch angegeben damit man sieht wie ein Fehlerreport aussieht.


    BTW: Ich hatte schon erwähnt dass ich diesen Thread als Blog betreibe. D.h. ich schreibe einfach zusammen was ich neu zu Thema go gelernt habe. Zugegebenermassen bin ich schon wesentlich weiter und muss aufpassen dass ich nichts bringe was aus didaktischen Gründen schon far away ist. Wer aber schon mal ausprobieren will wie man mit go im Netz rumstöbern will (go kommt von Google und ist dementsprechend sehr gut für alle möglichen Internetaufgaben bestens einsetzbar). Mit diesem Code kann man rausfinden was ein Server den man besucht zu dem Ort wo man sich befindet rausfinden kann. Der Code ist auch ein Beispiel wie leicht man JSON API Replys in go konsumieren kann.
    Automatisch zusammengefügt:[hr]


    BTW2: Es hat eine geringe Anzahl von 8 Leuten Interesse an diesem Thema bekundet. Meinen Code im Git zu pushen ist ein Klacks. Dann noch schreiben was in dem Code neu/anders ist kostet mich dann schon mehr Zeit.


    Kurzum: Ich habe kein Problem hier weiter zu Bloggen - aber wenn das Interesse per gefällt gen Null geht werden ich auch keine weiteren Beiträge erstellen. Mir geht es jetzt nicht darum meinen GefälltCounter aus irgendwelchen Gründen hochzubringen. Nur sehe ich nicht ein Zeit für etwas zu investieren welches in /dev/null landet :(

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().

  • Eben habe ich die Fibonacciberechung in eine separate Datei in ein separates Packet ausgelagert und noch einen Testcase dazu geschrieben um zu zeigen wie Pakete sowie Tests funktionieren. Dazu habe ich auch die obige Beschreibung angepasst.

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


  • Anbei ein kleines BeispielProgramm welches für beliebige Orte die Sonnenauf- und Untergangszeit berechnet. Dazu werden zwei REST API Calls zu Google und sunrisesunset.org ausgeführt um die Coordinaten eines Ortes zu ermitteln und dann dazu die UTC Zeiten des Ortes. Anschliessend werden sie auf die lokale Zeit umgerechnet und ausgegeben.


    Die Ausgabe sieht z.B. wie folgt aus:


    Oder für New York


    Folgende Features/Packages von Go werden hier benutzt:


    1) Einlesen von Commandlineparametern (flag package)
    2) HTTP get call aufsetzen (net/http package)
    3) unmarshaling der REST API JSON response in ein Go struct (encoding/json package)
    4) urlencoding von Query Parametern (net/url package)
    5) Umrechnen von Zeiten in andere Zeitzonen (time package)


    Der Beispielcode findet sich hier auf github


    Aufruf zum lokalen Bauen des Programs (Voraussetzung: go installiert und konfiguriert auf der Raspberry (s.o.))

    Code
    go build github.com/framps/golang_tutorial/geoLocationSunriseSunset


    und starten mit

    Code
    geoLocationSunriseSunset -location "New York"


    Wer den Payload von den REST Calls sehen möchte kann noch -debug als weiteren Parameter angeben.


    Man merkt sehr gut dass go von Google kommt und extrem Web/Internet freundlich ist. Ein http Client ist im Standard drin. Ausserdem alles was man zum xml/json Handling benötigt. Ein http Server ebenso (Wird demnächst vorgestellt)


    PS: Wer seine Raspi schonen will kann auch auf einem x386 System wie folgt den arm Code generieren:

    Code
    env GOOS=linux GOARCH=arm go build -v github.com/framps/golang_tutorial/geoLocationSunriseSunset

    und dann das Programm auf die Raspi kopieren und dort ausführen.

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().

  • Eben habe ich noch eine Datei im github gepushed wo die wichtigsten Typen von go kurz beispielhaft erklärt sind. Wer detailiertes wissen will kann Tour of go durchgehen. Das Schöne ist dass man den Beispielcode da auch gleich ändern und Laufen lassen kann ;) Auch gibt es einen sog. go Playground wo man kleiner Goprogramme im Webfrontend eingeben und laufen lassen kann. Einfach mal so zum Spielen :)


    Die wichtigsten Unterschiede zu C bzw Python:


    1) Type strings sind immer in UTF-8
    2) Type rune sind UTF-8 'characters' bzw codepoints und sind demnach auch nicht 8 bits lang
    3) Type byte ist binaeres byte, kein C-char und hat 8 Bits
    4) Type map (Wichtig für Pythonier)
    5) Type complex
    6) Type array ist statisch wie in C
    7) Type slice ist ein dynamisches array. Gibt es nicht in C und entspricht ein wenig der Liste in Python. Nur wächst der Slice nicht dynamisch wie in Python sondern das muss programmatisch getan werden.


    Natürlich gibt es Pointer und Strukturen sowie Typdefinitioen wie in C. Allerdings ist alles streng getyped: Ein array[5]int ist nicht kompatibel zu einem array[10]int. Auch ist ein Pointer auf ein array[5]int nicht kompatibel zu einem Pointer auf ein array[10]int. Auch kann ein Array kein Pointer sein wie in C.

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().

  • Heute Abend habe ich mir mal angesehen wie einfach und schnell man einen https Server in go anlegen kann. Das Ergebnis findet sich hier. Download per

    Code
    go get github.com/framps/golang_tutorial/httpsServer


    Es wird ein TLS Credential erstellt sofern es noch nicht existiert und ein http Server gestartet, der alle http Requests auf Port 8080 auf https Port 8443 redirected.


    Ausserdem wird eine go Routine benutzt auf die ich noch später genauer eingehen will. Mit

    Code
    go http.ListenAndServe(httpPort, http.HandlerFunc(redirect))


    wird zum aktuellen Programm die redirect Funktion gestartet, die parallel zum main auf dem unsicheren Port 8080 lauscht und jeden Request auf den sicheren Port 8443 redirected. Parallel wird es erst ausgeführt wenn man die Environmentvariable GOMAXPROCS hochsetzt. Bei einer Raspi3 ist das also z.B. möglich. Ansonsten wird die Ausführung von der go Runtime gescheduled.


    Go Rountines werden von der go Runtime abgehandelt und sind leichtgewichtig d.h. es ist kein Problem eine größere Menge davon zu benutzen. Synchronisation und Kommunikation zwischen go Routines kann über sog. Channels vorgenommen werden. Wer das Thema interessant findet kann hier und hier sich schon mal mit go Routines vertraut machen :)

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


  • Go unterstützt wie C keine Vererbung und kennt auch keine Klassen. Allerdings gibt es sog. Methoden. Damit kann man für Strukturen, die in OO den Datenteil einer Klasse repräsentieren, beliebige Methoden (Methoden im OO Sinne) definieren. D.h. die C++ Notation

    Code
    Car ferrari("Ferrari","Red",350)
    ferrari.Accelerate(100)

    kann man in Go wie folgt schreiben

    Code
    var ferrari Car = NewCar("Ferrari", "Red", 350)
    ferrari.Accelerate(100)


    Allerdings gibt es in go keinen OO Konstruktor wie in C++. Das erledigt man dann typischweise in Go dadurch dass man eine Funktion NewCar definiert, die eine Car Struktur zurückliefert die entsprechende Methoden hat. Wenn man dann alle Variablen mit Kleinbuchstaben beginnen lässt kann auch kein Benutzer der go 'Klasse' auf Internas zugreifen.


    Das ist ein weiteres Thema was ich mal später genauer behandeln werde: Scoping. In diesem Falle ganz kurz: Alle Variablen, Typen und Strukturen sind private wenn sie mit Kleinbuchstaben anfangen und public wenn sie mit Grossbuchstaben anfangen.


    Der Beispielcode findet sich hier. Download in den lokalen go Workspace mit

    Code
    go get https://github.com/framps/golang_tutorial/methods


    Weitere Infos auch auf tour.golang.org

    Sichere Deine Raspbberry regelmäßig mit raspiBackup . Sicher ist sicher ;-)


    Darum gebe ich keinen Support per PN


    "Really, I'm not out to destroy Microsoft. That will just be a completely unintentional side effect." Linus Benedict Torvalds, 28.9.2003


    Edited once, last by framp ().