// 1. hét – Érték, mutató és szelet (slice) Go nyelven
// Futtatás: go run ./h01/valueref
package main

import "fmt"

// Érték szerinti átadás: a függvény másolatot kap.
func increment(x int) {
	x = x + 1
}

// Mutató szerinti átadás: a függvény a változó címét kapja.
func incrementPtr(x *int) {
	*x = *x + 1
}

// Go-ban a csere mutatókkal megoldható.
func swap(a, b *int) {
	*a, *b = *b, *a
}

// A tömb ([3]int) érték: átadáskor az egész tömb lemásolódik.
func incrementFirstArray(t [3]int) {
	t[0]++
}

// A szelet ([]int) egy kis leíró, amely a háttértömbre hivatkozik:
// a függvény ugyanazokat az elemeket látja.
func incrementFirstSlice(t []int) {
	t[0]++
}

func main() {
	a := 5
	increment(a)
	fmt.Println("increment után a =", a) // 5

	incrementPtr(&a)
	fmt.Println("incrementPtr után a =", a) // 6

	p := &a // p egy mutató, értéke a címe
	fmt.Printf("a címe: %p, *p = %d\n", p, *p)

	x, y := 1, 2
	swap(&x, &y)
	fmt.Println("swap után x, y =", x, y) // 2 1

	arr := [3]int{10, 20, 30}
	incrementFirstArray(arr)
	fmt.Println("tömb – incrementFirstArray után:", arr) // [10 20 30]

	sl := []int{10, 20, 30}
	incrementFirstSlice(sl)
	fmt.Println("szelet – incrementFirstSlice után:", sl) // [11 20 30]

	// Két szelet ugyanarra a háttértömbre mutathat
	other := sl
	other[1] = 0
	fmt.Println("other[1] = 0 után sl =", sl) // [11 0 30]

	// nil mutató: nem mutat sehova
	var q *int
	fmt.Println("q == nil ?", q == nil)
	// fmt.Println(*q) // futási hiba: nil pointer dereference
}
