package main

import "fmt"

func main() {
	// цикл без условия, while(true) or for(;;;)
	for {
		fmt.Println("loop iteration")
		break
	}

	// цикл без условия, while(isRun)
	isRun := true
	for isRun {
		fmt.Println("loop iteration  with condition")
		isRun = false
	}

	// цикл с условием и блоком инициализации
	for i := 0; i < 2; i++ {
		fmt.Println("loop iteration", i)
		if i == 1 {
			continue
		}
	}

	// операции со slice
	sl := []int{1, 2, 3}
	idx := 0

	for idx < len(sl) {
		fmt.Println(idx, sl[idx])
		idx++
	}

	for i := 0; i < len(sl); i++ {
		fmt.Println("c-syle loop", i, sl[i])
	}

	// здесь range возвращает только индекс
	for idx := range sl {
		fmt.Println("range slice by index", idx)
	}

	// а здесь range вернет индекс и копию значения
	for idx, val := range sl {
		fmt.Println("range slice by idx-value", idx, val)
	}

	// операции по map
	profile := map[int]string{1: "Vasily", 2: "Romanov"}

	// Но ключи в map могут быть в разном порядке от запуска к запуску
	for key := range profile {
		fmt.Println(key)
	}

	for key, val := range profile {
		fmt.Println(key, val)
	}

	for _, val := range profile {
		fmt.Println(val)
	}

	// итерация по строке - итерация по отдельным символам
	str := "Привет, Мир!"
	for pos, char := range str {
		fmt.Printf("%#U at pos %d\n", char, pos)
	}

}
