[[:oktatas:programozás:go|< Go]] ====== Go nyelv ====== * **Szerző:** Sallai András * Copyright (c) 2025, Sallai András * Szerkesztve: 2025 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Bevezetés ===== A Go nyelv **Google** által támogatott nyelv, de a tulajdonosa **Robert Griesemer**. 2007-ben kezdték, az első nyilvános kiadás 2009-ben volt. Névütközés miatt Golang nyelvnek szokták nevezni. A fejlesztés során az egyszerűség és a hatékonyság volt a cél. Szintaxisa a C nyelvhez áll közel, a típusdeklaráció kivételével. De eltér az if és a ciklus utasítások szintaxisa is. Webhely: * https://go.dev/ ===== Helló Világ ===== Készítsünk egy hello.go nevű állományt, amelynek tartalma a következő: package main import "fmt" func main() { fmt.Println("Helló Világ") } Futtatás: go run hello.go Fordítás és fordított alkalmazás futtatása: go build hello.go ./hello A Go programokat egy .go kiterjesztésű fájlba írjuk. Futtatni a go run paranccsal tudjuk. Fordítás és futtatásra is lehetőség van. ===== Megjegyzés ===== // egy soros /* több soros megjegyzés */ ===== Kivitel ===== package main func main() { println("Helló Világ!") } package main import "fmt" func main() { fmt.Println("első") fmt.Println("második") } package main import "fmt" func main() { fmt.Print("első") fmt.Println("második") } Kifejezések: fmt.Println(3 * 5) Több paraméter: fmt.Println("egy", "kettő") ===== Escape szekvenciák ===== package main import "fmt" func main() { fmt.Println("me\ntés") } package main import "fmt" func main() { fmt.Println("men\tés") } | \a | Csengőhang | | \b | Backspace | | \\\\ | Backslash | | \t | Vízszintes tabulátor | | \n | Új sor | | \f | Lapdobás | | \r | Kocsi vissza | | \v | Függőleges tabulátor | | \' | Egyszeres idézőjel | | \" | Kétszeres idézőjel | | \x | pontosan két hexadecimális szám követi | | \ | pontosan három hexadecimális szám követi | | \u | pontosan négy hexadecimális szám követi| | \U | pontosan nyolc hexadecimális szám követi | ===== Változók ===== var a = 35 Egyszerűsített verzió: a := 35 package main import "fmt" func main() { var a = 35 fmt.Println(a) } ==== Valós számok ==== var num1 float32 = 3.14 var num2 float64 = 2.71828 ===== Formázott kimenet ===== package main import "fmt" func main() { var a = 35 fmt.Printf("%d\n", a) } ===== Matematikai könyvtárak ===== package main import ( "fmt" "math" ) func main() { var a = -9.0 fmt.Println(math.Abs(a)) } ===== Véletlen szám ===== package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) var a = rand.Intn(10-1) + 1 fmt.Println(a) } ===== Operátorok ===== package main func main() { var a = 30 var b = 35 var res1 = a + b var res2 = a - b var res3 = a * b var res4 = a / b println(res1, res2, res3, res4) } ===== Konvertálás ===== Szöveg számmá: package main import ( "fmt" "reflect" "strconv" ) func main() { var szoveg = "45" var szam, err = strconv.Atoi(szoveg) if err != nil { fmt.Println(err) } else { fmt.Println(reflect.TypeOf(szam)) } } ===== Bekérés ===== package main import ( "fmt" ) func main() { var nev string fmt.Print("Add meg a neved: ") fmt.Scanln(&nev) fmt.Println("Helló ", nev) } go run beker.go Szám bekérése: package main import ( "fmt" ) func main() { var num int fmt.Print("Add meg az életkorod: ") fmt.Scanln(&num) fmt.Println("Helló ", num, " éves") } ===== Szelekció ===== A if utasítás használható szelekcióra. A if kulcsszó után zárójelek nélkül leírjuk a feltételt. A blokkot a kapcsos zárójelek "{}" határozzák meg. package main import ( "fmt" ) func main() { var num int fmt.Print("Írj be egy számot: ") fmt.Scanln(&num) if num > 0 { fmt.Println("A szám pozitív.") } else if num < 0 { fmt.Println("A szám negatív.") } else { fmt.Println("A szám nulla.") } } A switch: package main import ( "fmt" ) func main() { var num int fmt.Print("Írj be egy számot: ") fmt.Scanln(&num) switch num { case 0: fmt.Println("Nulla") case 1: fmt.Println("Egy") case 2: fmt.Println("Kettő") default: fmt.Println("Imseretlen") } } ===== Iteráció ===== A Go nyelvben egyetlen ciklus utasítás van, de az használható több módon is. Számláló típusú ciklus: package main import ( "fmt" ) func main() { for i := 0; i < 10; i++ { fmt.Println(i) } } A for csak feltétellel, azaz amíg típusú ciklus: package main import ( "fmt" ) func main() { i := 0 for i < 10 { fmt.Println(i) i++ } } Végtelen ciklus megszakítva: func main() { i := 0 for { if i > 5 { break } fmt.Println(i) i++ } } A range ciklus: package main import ( "fmt" ) func main() { nums := []int{1, 2, 3, 4, 5} for index, value := range nums { fmt.Println(index, value) } } ===== Függvények ===== A függvényeket a **func** kulcsszóval vezetjük be. Sorrendjük mindegy. Ha visszatérési értéket is megadunk a **return** utasítást kell használnunk. package main import ( "fmt" ) func main() { about() } func about() { fmt.Println("Para Irén") fmt.Println("Szeged") } package main import ( "fmt" ) func main() { calcDouble(10) } func calcDouble(num int) { fmt.Println(num * 2) } Visszaadott érték: package main import ( "fmt" ) func main() { var sum = calcSum(1, 2) fmt.Println(sum) } func calcSum(num1 int, num2 int) int { return num1 + num2 } ===== Karakterláncok ===== package main import ( "fmt" ) func main() { var szoveg string = ` Aranyszabály köztudott ` fmt.Println(szoveg) } ==== Hossz ==== Hány bájt hosszú: word := "árvíztűrő" fmt.Println(len(word)) Karakterek száma: package main import ( "fmt" "unicode/utf8" ) func main() { word := "árvíztűrő" fmt.Println(utf8.RuneCountInString(word)) } ===== Tömbök ===== package main import ( "fmt" ) func main() { var numbers [4]int numbers[0] = 35 numbers[1] = 45 numbers[2] = 55 numbers[3] = 65 fmt.Println(numbers[0]) } Tömb kezdőértékkel: package main import ( "fmt" ) func main() { numbers := [4]int{35, 45, 55, 65} fmt.Println(numbers[0]) } ==== Valós számok ==== numbers := [4]float32{3.7, 3.5, 3.4, 3.6} fmt.Println(numbers) ==== Méret ==== numbers := [4]int{35, 45, 55, 65} fmt.Println(len(numbers)) ==== Fájlkezelés ==== package main import ( "fmt" "os" ) func main() { fp, err := os.OpenFile("beker.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { fmt.Println(err) return } defer fp.Close() fmt.Fprintln(fp, "alma") } A **defer** utasítás hatására a bezárás csak akkor hajtódik végre, ha függvény végrehajtása a végére ért. Beolvasás: package main import ( "fmt" "os" ) func main() { data, err := os.ReadFile("beker.txt") if err != nil { fmt.Println(err) return } fmt.Println(string(data)) } ==== Beolvasás soronkénti bejárással ==== package main import ( "fmt" "os" "bufio" ) func main() { file, err := os.Open("beker.txt") if err != nil { fmt.Println(err) return } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { fmt.Println(scanner.Text()) } if err := scanner.Err(); err != nil { fmt.Println(err) } }