[[: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)
}
}