// 3. hét – Tömbök és szeletek alapjai Go nyelven
// Futtatás: go run ./h03/arraybasics
package main

import (
	"fmt"
	"slices"
)

func main() {
	// Tömb: a méret a TÍPUS része ([5]int és [6]int különböző típusok)
	var a [5]int // minden elem 0
	primes := [5]int{2, 3, 5, 7, 11}
	auto := [...]string{"a", "b", "c"} // a fordító számolja meg a méretet
	fmt.Println("a =", a, "primes =", primes, "auto =", auto, "len =", len(auto))

	// Közvetlen elérés – O(1)
	primes[0] = 1
	fmt.Println("primes[4] =", primes[4])

	// Indexhatár: konstans indexnél fordítási hiba, változónál futási hiba (panic)
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Hiba:", r)
			rest()
		}
	}()
	i := 5
	primes[i] = 13 // panic: index out of range
}

func rest() {
	primes := [5]int{1, 3, 5, 7, 11}

	// Bejárás
	sum := 0
	for _, p := range primes {
		sum += p
	}
	fmt.Println("összeg =", sum)

	// A tömb ÉRTÉK: az értékadás lemásolja!
	cp := primes
	cp[1] = 100
	fmt.Println("primes[1] =", primes[1], ", cp[1] =", cp[1])

	// Szelet (slice): dinamikus méretű "nézet" egy háttértömbre
	s := []int{5, 2, 9, 1}
	s = append(s, 7) // bővítés
	fmt.Println("szelet:", s, "len =", len(s), "cap =", cap(s))

	alias := s // a szelet értékadása NEM másolja az elemeket
	alias[0] = 0
	fmt.Println("alias[0] = 0 után s[0] =", s[0])

	dup := slices.Clone(s) // valódi másolat
	slices.Sort(dup)
	fmt.Println("rendezett másolat:", dup, ", eredeti:", s)

	z := make([]int, 3, 10) // len 3, cap 10
	fmt.Println("make([]int, 3, 10):", z, len(z), cap(z))
}
