beispiel-programme_in_go
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| beispiel-programme_in_go [2017-06-08 10:00:59] – manfred | beispiel-programme_in_go [2023-01-17 00:05:55] (aktuell) – [Verwendung einer Bibliothek] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Beispiel-Programme in Go ====== | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | ==== Hallo Welt ==== | ||
| + | |||
| + | > vi Hallo_Welt.go | ||
| + | <file go Hallo_Welt.go> | ||
| + | //Hallo Welt | ||
| + | package main | ||
| + | |||
| + | import " | ||
| + | |||
| + | func main() | ||
| + | { | ||
| + | var welt string = " | ||
| + | fmt.Printf(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | > go build Hallo_Welt.go | ||
| + | > ./ | ||
| + | Hallo Welt! | ||
| + | |||
| + | |||
| + | ==== Funktionstest ==== | ||
| + | |||
| + | > vi Funktionstest.go | ||
| + | <file go Funktionstest.go> | ||
| + | // Funktionstest | ||
| + | package main | ||
| + | |||
| + | import " | ||
| + | |||
| + | func Hallo(name string) { | ||
| + | begruessung := "Hallo %v!\n" | ||
| + | fmt.Printf(begruessung, | ||
| + | } | ||
| + | |||
| + | func Tschuess(name string) { | ||
| + | verabschiedung := " | ||
| + | fmt.Printf(verabschiedung, | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | var Welt string = " | ||
| + | |||
| + | Hallo(Welt) | ||
| + | |||
| + | Tschuess(Welt) | ||
| + | } | ||
| + | </ | ||
| + | > go build Funktionstest.go | ||
| + | > ./ | ||
| + | Hallo verbesserte Welt! | ||
| + | Tschüß, verbesserte Welt! | ||
| + | |||
| + | |||
| + | |||
| + | ==== Verzweigungen ==== | ||
| + | |||
| + | > vi verzweigung_1.go | ||
| + | <file go verzweigung_1.go> | ||
| + | // Verzweigung mit switch | ||
| + | package main | ||
| + | |||
| + | import " | ||
| + | |||
| + | func Hallo(gender int, name string) { | ||
| + | var addr string | ||
| + | |||
| + | switch gender { | ||
| + | default: | ||
| + | addr = "" | ||
| + | case 1: | ||
| + | addr = "Frau " | ||
| + | case 2: | ||
| + | addr = "Herr " | ||
| + | } | ||
| + | |||
| + | fmt.Printf(" | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | Hallo(1, " | ||
| + | Hallo(2, " | ||
| + | Hallo(3, " | ||
| + | } | ||
| + | </ | ||
| + | > go build verzweigung_1.go | ||
| + | > ./ | ||
| + | Hallo, Frau Fritz! | ||
| + | Hallo, Herr Fratz! | ||
| + | Hallo, Fummel! | ||
| + | |||
| + | |||
| + | ---- | ||
| + | > vi verzweigung_2.go | ||
| + | <file go verzweigung_2.go> | ||
| + | // Verzweigung mit if | ||
| + | package main | ||
| + | |||
| + | import " | ||
| + | |||
| + | func Hallo(gender int, name string) { | ||
| + | var addr string | ||
| + | |||
| + | if gender == 1 { | ||
| + | addr = "Frau " | ||
| + | } else { | ||
| + | if gender == 2 { | ||
| + | addr = "Herr " | ||
| + | } else { | ||
| + | addr = "" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | fmt.Printf(" | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | Hallo(1, " | ||
| + | Hallo(2, " | ||
| + | Hallo(3, " | ||
| + | } | ||
| + | </ | ||
| + | > go build verzweigung_2.go | ||
| + | > ./ | ||
| + | Hallo, Frau Fritz! | ||
| + | Hallo, Herr Fratz! | ||
| + | Hallo, Fummel! | ||
| + | |||
| + | |||
| + | ==== Schleifen ==== | ||
| + | |||
| + | |||
| + | === Zählschleife === | ||
| + | |||
| + | > vi zaehlschleife.go | ||
| + | <file go zaehlschleife.go> | ||
| + | // Zählschleife | ||
| + | package main | ||
| + | |||
| + | import " | ||
| + | |||
| + | func main() { | ||
| + | // initializiere i nit 0 | ||
| + | // kontrolliere jedes mal ob i kleiner als 5 ist | ||
| + | // i bei jedem Durchlauf um 1 vergrößern | ||
| + | for i := 0; i <= 5; i++ { | ||
| + | fmt.Println(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build zaehlschleife.go | ||
| + | > ./ | ||
| + | Der Wert von ' | ||
| + | Der Wert von ' | ||
| + | Der Wert von ' | ||
| + | Der Wert von ' | ||
| + | Der Wert von ' | ||
| + | Der Wert von ' | ||
| + | |||
| + | |||
| + | === nebenläufige Abarbeitung (parallele Programmierung) von Daten aus einem Kanal === | ||
| + | |||
| + | > vi kanal_10.go | ||
| + | <file go kanal_10.go> | ||
| + | // nebenläufige Abarbeitung (parallele Programmierung) von Daten aus einem Kanal | ||
| + | package main | ||
| + | |||
| + | import " | ||
| + | |||
| + | func zehnMal(kanal chan string) { | ||
| + | // Argument empfangen | ||
| + | sag := <-kanal | ||
| + | |||
| + | // Zehn mal zurückschreiben | ||
| + | for i := 0; i < 10; i++ { | ||
| + | kanal <- sag | ||
| + | } | ||
| + | |||
| + | // Kanal schließen | ||
| + | close(kanal) | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | // synchronen Kanal öffnen | ||
| + | //kanal := make(chan string) | ||
| + | kanal := make(chan string, 0) | ||
| + | |||
| + | // Starten der parallelen Go-Routine „zehnMal()“ | ||
| + | go zehnMal(kanal) | ||
| + | | ||
| + | // Senden eines Strings | ||
| + | kanal <- " | ||
| + | |||
| + | // Empfangen der Strings, bis der Channel geschlossen wird | ||
| + | for s := range kanal { | ||
| + | fmt.Println(s) | ||
| + | } | ||
| + | |||
| + | fmt.Println(" | ||
| + | } | ||
| + | </ | ||
| + | > go build kanal_10.go | ||
| + | > ./kanal_10 | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Hallo | ||
| + | Fertig! | ||
| + | |||
| + | |||
| + | === zeilenweise Abarbeitung von einem Array (Liste) === | ||
| + | |||
| + | |||
| + | == einfache iterierende for-Schleife == | ||
| + | |||
| + | > vi for-schleife_1.go | ||
| + | <file go for-schleife_1.go> | ||
| + | // einfache iterierende for-Schleife | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | var timeZone = []string{ | ||
| + | " | ||
| + | "EST: -5*60*60", | ||
| + | "CST: -6*60*60", | ||
| + | "MST: -7*60*60", | ||
| + | "PST: -8*60*60", | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | for _, j := range timeZone { | ||
| + | fmt.Printf(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build for-schleife_1.go | ||
| + | > ./ | ||
| + | |||
| + | |||
| + | == iterierende for-Schleife mit Index == | ||
| + | |||
| + | > vi for-schleife_2.go | ||
| + | <file go for-schleife_2.go> | ||
| + | // iterierende for-Schleife mit Index | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | var Zeitspannen = map[string]int{ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | for i, j := range Zeitspannen { | ||
| + | fmt.Printf(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build for-schleife_2.go | ||
| + | > ./ | ||
| + | |||
| + | |||
| + | ==== Parameter-Übergabe ==== | ||
| + | |||
| + | > vi parameter.go | ||
| + | <file go parameter.go> | ||
| + | // Parameter-Übergabe | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | func main() { | ||
| + | // definiere das Flag " | ||
| + | par1p := flag.Int(" | ||
| + | // | ||
| + | // definiere das Flag " | ||
| + | par2p := flag.String(" | ||
| + | |||
| + | // Ausgabe des Vorgabewertes vom Parameter | ||
| + | fmt.Println("' | ||
| + | fmt.Println("' | ||
| + | |||
| + | // Parse | ||
| + | flag.Parse() | ||
| + | |||
| + | // Ausgabe des übergebenen Wertes vom Parameter | ||
| + | fmt.Println() | ||
| + | fmt.Println("' | ||
| + | fmt.Println("' | ||
| + | } | ||
| + | </ | ||
| + | > go build parameter.go | ||
| + | > ./parameter | ||
| + | ' | ||
| + | ' | ||
| + | | ||
| + | ' | ||
| + | ' | ||
| + | | ||
| + | > ./parameter -par1=20 -par2=" | ||
| + | ' | ||
| + | ' | ||
| + | | ||
| + | ' | ||
| + | ' | ||
| + | | ||
| + | > ./parameter -par1=20 -par2=12 | ||
| + | ' | ||
| + | ' | ||
| + | | ||
| + | ' | ||
| + | ' | ||
| + | | ||
| + | > ./parameter -par1=" | ||
| + | ' | ||
| + | ' | ||
| + | invalid value "alles super" for flag -par1: strconv.ParseInt: | ||
| + | Usage of ./ | ||
| + | -par1=12: dieser Parameter kann nur Integer-Werte annehmen | ||
| + | -par2=" | ||
| + | |||
| + | |||
| + | ==== Argumenten-Übergabe ==== | ||
| + | |||
| + | > vi Argumente.go | ||
| + | <file go Argumente.go> | ||
| + | // Argumenten-Übergabe | ||
| + | package main | ||
| + | |||
| + | import " | ||
| + | import " | ||
| + | |||
| + | func main() { | ||
| + | for i := range os.Args[1:] { | ||
| + | i += 1 | ||
| + | arg := os.Args[i] | ||
| + | fmt.Printf(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | > go build Argumente.go | ||
| + | > ./Argumente A B C D E F G H I J K L M | ||
| + | Das 1. Argument ist A. | ||
| + | Das 2. Argument ist B. | ||
| + | Das 3. Argument ist C. | ||
| + | Das 4. Argument ist D. | ||
| + | Das 5. Argument ist E. | ||
| + | Das 6. Argument ist F. | ||
| + | Das 7. Argument ist G. | ||
| + | Das 8. Argument ist H. | ||
| + | Das 9. Argument ist I. | ||
| + | Das 10. Argument ist J. | ||
| + | Das 11. Argument ist K. | ||
| + | Das 12. Argument ist L. | ||
| + | Das 13. Argument ist M. | ||
| + | |||
| + | |||
| + | ==== Dateioperationen ==== | ||
| + | |||
| + | <file go dateiinhalt_in_variable_einlesen.go> | ||
| + | // Dateiinhalt in eine Variable einlesen | ||
| + | |||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | //" | ||
| + | ) | ||
| + | |||
| + | func main() { | ||
| + | var ( | ||
| + | file string | ||
| + | err error | ||
| + | ) | ||
| + | |||
| + | file = os.Args[1] | ||
| + | datei, err := ioutil.ReadFile(file) | ||
| + | if err != nil { | ||
| + | panic(err) | ||
| + | } | ||
| + | inhalt := string(datei) | ||
| + | |||
| + | fmt.Println(inhalt) | ||
| + | // | ||
| + | |||
| + | // Zeilenumbrüche gegen " | ||
| + | //zeile := (strings.Replace(inhalt, | ||
| + | |||
| + | // dort, wo vorher Leerzeilen waren, sind jetzt " | ||
| + | // " | ||
| + | //daten := (strings.Replace(zeile, | ||
| + | |||
| + | // | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file go dateiinhalt_in_array_einlesen.go> | ||
| + | // Dateiinhalt zeilenweise in ein Array einlesen | ||
| + | |||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | //" | ||
| + | //" | ||
| + | ) | ||
| + | |||
| + | func readLines(path string) (lines []string, err error) { | ||
| + | var ( | ||
| + | file *os.File | ||
| + | part []byte | ||
| + | prefix bool | ||
| + | ) | ||
| + | if file, err = os.Open(path); | ||
| + | return | ||
| + | } | ||
| + | defer file.Close() | ||
| + | |||
| + | reader := bufio.NewReader(file) | ||
| + | buffer := bytes.NewBuffer(make([]byte, | ||
| + | for { | ||
| + | if part, prefix, err = reader.ReadLine(); | ||
| + | break | ||
| + | } | ||
| + | buffer.Write(part) | ||
| + | if !prefix { | ||
| + | lines = append(lines, | ||
| + | buffer.Reset() | ||
| + | } | ||
| + | } | ||
| + | if err == io.EOF { | ||
| + | err = nil | ||
| + | } | ||
| + | return | ||
| + | } | ||
| + | |||
| + | |||
| + | func main() { | ||
| + | dateiinhalt_alle_zeilen, | ||
| + | fmt.Println(dateiinhalt_alle_zeilen) | ||
| + | |||
| + | // alle Zeilen aus dem Array " | ||
| + | // werden, durch " | ||
| + | // | ||
| + | // | ||
| + | |||
| + | // | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | === vorhandene Datei überschreiben bzw. Datei neu anlegen === | ||
| + | |||
| + | > vi datei_ueberschreiben.go | ||
| + | <file go datei_ueberschreiben> | ||
| + | // vorhandene Datei überschreiben bzw. Datei neu anlegen | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | func main() { | ||
| + | var datei string | ||
| + | var text string | ||
| + | |||
| + | datei = "/ | ||
| + | text = "Hallo Welt!\n" | ||
| + | |||
| + | // die Datei wird neu angelegt, dabei geht der alte Inhalt verloren | ||
| + | os.Create(datei) | ||
| + | // wenn die Datei existiert, dann wird sie überschrieben | ||
| + | f, err1 := os.OpenFile(datei, | ||
| + | // | ||
| + | // hier wird überprüft, | ||
| + | if err1 != nil { | ||
| + | log.Fatal(err1) | ||
| + | } | ||
| + | |||
| + | // hier wird die Datei-Kennzeichnung, | ||
| + | // fmt.Printf(" | ||
| + | |||
| + | // hier wird in die Datei geschrieben | ||
| + | g, err2 := f.WriteString(text) | ||
| + | fmt.Printf(" | ||
| + | |||
| + | // hier wird überprüft, | ||
| + | if err2 != nil { | ||
| + | log.Fatal(err2) | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build datei_ueberschreiben.go | ||
| + | > ./ | ||
| + | |||
| + | |||
| + | === Datei von Beginn an überschreiben (auch unvollständig) === | ||
| + | |||
| + | > vi datei_schreiben.go | ||
| + | <file go datei_schreiben> | ||
| + | // Datei von Beginn an überschreiben (auch unvollständig) | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | func main() { | ||
| + | var datei string | ||
| + | var text string | ||
| + | |||
| + | datei = "/ | ||
| + | text = "Hallo Welt!\n" | ||
| + | |||
| + | // wenn die Datei noch nicht existiert, dann wird sie angelegt | ||
| + | // wenn die Datei bereits vorhanden ist, dann werden die neuen Daten vom | ||
| + | // Beginn der Datei an geschrieben; | ||
| + | // sich bereits in der Datei befanden, dann bleibt der Rest weiterhin bestehen | ||
| + | f, err1 := os.OpenFile(datei, | ||
| + | // | ||
| + | // hier wird überprüft, | ||
| + | if err1 != nil { | ||
| + | log.Fatal(err1) | ||
| + | } | ||
| + | |||
| + | // hier wird die Datei-Kennzeichnung, | ||
| + | // fmt.Printf(" | ||
| + | |||
| + | // hier wird in die Datei geschrieben | ||
| + | g, err2 := f.WriteString(text) | ||
| + | fmt.Printf(" | ||
| + | |||
| + | // hier wird überprüft, | ||
| + | if err2 != nil { | ||
| + | log.Fatal(err2) | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build datei_schreiben.go | ||
| + | > ./ | ||
| + | |||
| + | |||
| + | === an Datei anhängen === | ||
| + | |||
| + | > vi datei_anhaengen.go | ||
| + | <file go datei_anhaengen> | ||
| + | // an Datei anhängen | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | func main() { | ||
| + | var datei string | ||
| + | var text string | ||
| + | |||
| + | datei = "/ | ||
| + | text = "Hallo Welt!\n" | ||
| + | |||
| + | // wenn die Datei noch nicht existiert, dann wird sie angelegt | ||
| + | // wenn die Datei bereits vorhanden ist, dann werden die neuen Daten vom | ||
| + | // Beginn der Datei an geschrieben; | ||
| + | // sich bereits in der Datei befanden, dann bleibt der Rest weiterhin bestehen | ||
| + | f, err1 := os.OpenFile(datei, | ||
| + | // | ||
| + | // gehe ans Ende | ||
| + | f.Seek(0, 2) | ||
| + | // | ||
| + | // hier wird überprüft, | ||
| + | if err1 != nil { | ||
| + | log.Fatal(err1) | ||
| + | } | ||
| + | |||
| + | // hier wird die Datei-Kennzeichnung, | ||
| + | // fmt.Printf(" | ||
| + | |||
| + | // hier wird in die Datei geschrieben | ||
| + | g, err2 := f.WriteString(text) | ||
| + | fmt.Printf(" | ||
| + | |||
| + | // hier wird überprüft, | ||
| + | if err2 != nil { | ||
| + | log.Fatal(err2) | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build datei_anhaengen.go | ||
| + | > ./ | ||
| + | |||
| + | |||
| + | === Datei zeilenweise auslesen === | ||
| + | |||
| + | * [[http:// | ||
| + | |||
| + | > vi date_zeilenweise_lesen.go | ||
| + | <file go date_zeilenweise_lesen> | ||
| + | // Datei zeilenweise auslesen | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | func main() { | ||
| + | var datei string | ||
| + | datei = "/ | ||
| + | |||
| + | // Datei öffnen | ||
| + | f, err := os.Open(datei) | ||
| + | // kontrollieren, | ||
| + | if err != nil { | ||
| + | log.Fatal(err) | ||
| + | } | ||
| + | |||
| + | // Dateiinhalt aus der Datei in einen Puffer lesen | ||
| + | bf := bufio.NewReader(f) | ||
| + | |||
| + | // Endlosschleife starten | ||
| + | // die geht Zeile für Zeile durch die Datei | ||
| + | for { | ||
| + | // den Puffer zeilenweise auslesen | ||
| + | line, isPrefix, err := bf.ReadLine() | ||
| + | |||
| + | // kontrollieren, | ||
| + | if err == io.EOF { | ||
| + | break | ||
| + | } | ||
| + | |||
| + | // kontrollieren, | ||
| + | if err != nil { | ||
| + | log.Fatal(err) | ||
| + | } | ||
| + | |||
| + | // nach weiteren Fehler sehen; | ||
| + | // Bufio ist normalerweise 4K groß, ist eine Zeile größer als 4K | ||
| + | // gibt es hier eine Fehlermeldung; | ||
| + | // sollte es einen Fehler geben obwohl die Zeile kleiner als 4K ist, | ||
| + | // dann kann die Datei kaputt sein oder es wir die falsche Datei | ||
| + | // gelesen | ||
| + | if isPrefix { | ||
| + | log.Fatal(" | ||
| + | } | ||
| + | |||
| + | // Fertig | ||
| + | // aber beachte, dass die Daten hier als Byte-Stück (byte slice) | ||
| + | // und nicht als " | ||
| + | // Bist Du damit zufrieden, dann kannst Du das hier einsetzen. | ||
| + | fmt.Println(string(line)) | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build date_zeilenweise_lesen.go | ||
| + | > ./ | ||
| + | |||
| + | |||
| + | ==== Webseite aufrufen ==== | ||
| + | |||
| + | hiermit wird eine Webseite aufgerufen und dessen Quellkode ausgegeben | ||
| + | <file go go_web.go> | ||
| + | // Web-Aufruf | ||
| + | |||
| + | // | ||
| + | // Beispiele für Aufrufe: | ||
| + | // ./go_web -HOST=www.heise.de -PFAD=/ | ||
| + | // ./go_web -HOST www.heise.de -PFAD / | ||
| + | // | ||
| + | |||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | func GetWebsite(HOST , PFAD string) string { | ||
| + | NoCertVerify := & | ||
| + | TLSClientConfig: | ||
| + | } | ||
| + | |||
| + | NoCertVerifyHttp := & | ||
| + | |||
| + | JoinStrings := []string{" | ||
| + | Response, Error := NoCertVerifyHttp.Get(strings.Join(JoinStrings, | ||
| + | if Error != nil { | ||
| + | log.Fatal(Error) | ||
| + | } | ||
| + | |||
| + | Output, Error := ioutil.ReadAll(Response.Body) | ||
| + | Response.Body.Close() | ||
| + | if Error != nil { | ||
| + | log.Fatal(Error) | ||
| + | } | ||
| + | |||
| + | return string(Output) | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | HOSTPtr := flag.String(" | ||
| + | PFADPtr := flag.String(" | ||
| + | |||
| + | flag.Parse() | ||
| + | |||
| + | if *HOSTPtr != " | ||
| + | |||
| + | } else { | ||
| + | fmt.Println(" | ||
| + | os.Exit(2) | ||
| + | } | ||
| + | |||
| + | WebsiteContent := GetWebsite(*HOSTPtr, | ||
| + | |||
| + | if WebsiteContent != "" | ||
| + | fmt.Println(WebsiteContent) | ||
| + | os.Exit(0) | ||
| + | |||
| + | } else { | ||
| + | fmt.Println(" | ||
| + | os.Exit(1) | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build go_web.go | ||
| + | > ./go_web -IP=www.heise.de -PFAD=/ | ||
| + | > ./go_web -IP www.heise.de -PFAD / | ||
| + | |||
| + | |||
| + | === Eine Zeichenfolge im Quellkode einer Webseite suchen === | ||
| + | |||
| + | hiermit wird überprüft, | ||
| + | <file go web_check.go> | ||
| + | // Web-Check | ||
| + | |||
| + | // | ||
| + | // Beispiele für Aufrufe: | ||
| + | // go build web_check.go | ||
| + | // ./web_check -HOST=www.heise.de -PFAD=/ | ||
| + | // ./web_check -HOST www.heise.de -PFAD / -STRING ' | ||
| + | // | ||
| + | |||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | func GetWebsite(HOST , PFAD string) string { | ||
| + | |||
| + | NoCertVerify := & | ||
| + | TLSClientConfig: | ||
| + | } | ||
| + | |||
| + | NoCertVerifyHttp := & | ||
| + | |||
| + | JoinStrings := []string{" | ||
| + | Response, Error := NoCertVerifyHttp.Get(strings.Join(JoinStrings, | ||
| + | if Error != nil { | ||
| + | log.Fatal(Error) | ||
| + | } | ||
| + | |||
| + | Output, Error := ioutil.ReadAll(Response.Body) | ||
| + | Response.Body.Close() | ||
| + | if Error != nil { | ||
| + | log.Fatal(Error) | ||
| + | } | ||
| + | |||
| + | return string(Output) | ||
| + | } | ||
| + | |||
| + | func StringContains(WebsiteString, | ||
| + | |||
| + | if strings.Contains(WebsiteString, | ||
| + | return true | ||
| + | } else { | ||
| + | return false | ||
| + | } | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | |||
| + | HOSTPtr := flag.String(" | ||
| + | PFADPtr := flag.String(" | ||
| + | STRINGPtr := flag.String(" | ||
| + | |||
| + | flag.Parse() | ||
| + | |||
| + | if *HOSTPtr != " | ||
| + | |||
| + | |||
| + | } else { | ||
| + | fmt.Println(" | ||
| + | os.Exit(2) | ||
| + | } | ||
| + | |||
| + | WebsiteContent := GetWebsite(*HOSTPtr, | ||
| + | Status := StringContains(WebsiteContent, | ||
| + | |||
| + | if Status { | ||
| + | // | ||
| + | os.Exit(0) | ||
| + | |||
| + | } else { | ||
| + | // | ||
| + | os.Exit(1) | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | > go build web_check.go | ||
| + | > ./web_check -HOST www.heise.de -PFAD / -STRING ' | ||
| + | OK | ||
| + | | ||
| + | > ./web_check -HOST www.heise.de -PFAD / -STRING ' | ||
| + | KO | ||
| + | |||
| + | |||
| + | ==== Golang os exec Examples: Command Start and Run ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <file go programmaufruf.go> | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | func main() { | ||
| + | //var psize string | ||
| + | //psize = " | ||
| + | var psize string = " | ||
| + | var film = os.Args[1] | ||
| + | |||
| + | prog := " | ||
| + | cmd := exec.Command(prog, | ||
| + | |||
| + | out, err := cmd.Output() | ||
| + | if err != nil { | ||
| + | log.Fatal(err) | ||
| + | } | ||
| + | fmt.Printf(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | > go build programmstart.go | ||
| + | ./ | ||
| + | [STREAM] | ||
| + | index=0 | ||
| + | codec_name=mpeg2video | ||
| + | codec_long_name=MPEG-2 video | ||
| + | profile=Main | ||
| + | codec_type=video | ||
| + | codec_tag_string=[0][0][0][0] | ||
| + | codec_tag=0x0000 | ||
| + | width=720 | ||
| + | height=576 | ||
| + | ... | ||
| + | |||
| + | //In der Praxis wird man eine solche Aufgabe nicht so lösen, sondern dafür eine entsprechende Bibliothek einsetzen.// | ||
| + | |||
| + | |||
| + | === Verwendung einer Bibliothek === | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <file go FFprobeTest.go> | ||
| + | package main | ||
| + | |||
| + | import ( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | |||
| + | " | ||
| + | ) | ||
| + | |||
| + | func string2int(s string) int { | ||
| + | i, err := strconv.Atoi(s) | ||
| + | if err != nil { | ||
| + | i = 0 | ||
| + | } | ||
| + | return i | ||
| + | } | ||
| + | |||
| + | func main() { | ||
| + | var film = os.Args[1] | ||
| + | |||
| + | ctx, cancelFn := context.WithTimeout(context.Background(), | ||
| + | defer cancelFn() | ||
| + | |||
| + | data, err := ffprobe.ProbeURL(ctx, | ||
| + | if err != nil { | ||
| + | log.Panicf(" | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // | ||
| + | |||
| + | for i, s := range data.Streams { | ||
| + | codectype := s.CodecType | ||
| + | sprache, _ := s.TagList.GetString(" | ||
| + | fmt.Printf(" | ||
| + | |||
| + | if " | ||
| + | fmt.Printf(" | ||
| + | fmt.Printf(" | ||
| + | fmt.Printf(" | ||
| + | fmt.Printf(" | ||
| + | fmt.Printf(" | ||
| + | fmt.Printf(" | ||
| + | fmt.Printf(" | ||
| + | fmt.Printf(" | ||
| + | |||
| + | drehung := 0 | ||
| + | rotation, | ||
| + | drehlength := len([]rune(rotation)) | ||
| + | if drehlength > 0 { | ||
| + | drehung = string2int(rotation) | ||
| + | } | ||
| + | fmt.Printf(" | ||
| + | |||
| + | spieldauer := 0 | ||
| + | duration, | ||
| + | durlength := len([]rune(duration)) | ||
| + | if durlength > 0 { | ||
| + | var hms [3]int | ||
| + | rsplit := regexp.MustCompile(" | ||
| + | for g, h := range rsplit.Split(duration, | ||
| + | hms[g] = string2int(h) | ||
| + | } | ||
| + | |||
| + | // hms -> H:M:S -> Stunde: | ||
| + | spieldauer = hms[0]*3600 + hms[1]*60 + hms[2] | ||
| + | } | ||
| + | |||
| + | fmt.Printf(" | ||
| + | |||
| + | // Alle TAGs aus dem Container anzeigen | ||
| + | //for n, t := range s.TagList { | ||
| + | // | ||
| + | //} | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | > go build FFprobeTest.go | ||
| + | > ./ | ||
| + | Spur: 0, Typ: video, Sprache: eng | ||
| + | Spur: 0, Typ: video, Width: 720 | ||
| + | Spur: 0, Typ: video, Height: 576 | ||
| + | Spur: 0, Typ: video, PAR: 16:15 | ||
| + | Spur: 0, Typ: video, DAR: 4:3 | ||
| + | Spur: 0, Typ: video, Level: 8 | ||
| + | Spur: 0, Typ: video, FieldOrder: tt | ||
| + | Spur: 0, Typ: video, FPS: 25/1 | ||
| + | Spur: 0, Typ: video, avg FSP: 25/1 | ||
| + | Spur: 0, Typ: video, Drehung: 0 Grad | ||
| + | Spur: 0, Typ: video, Spieldauer: 122 Sekunden | ||
| + | Spur: 1, Typ: audio, Sprache: eng | ||
| + | Spur: 2, Typ: subtitle, Sprache: eng | ||
| + | Spur: 3, Typ: subtitle, Sprache: ger | ||
| + | </ | ||
| + | |||
