В Go есть только одна циклическая конструкция - цикл for:

package main

import "fmt"

func main() {
	sum := 0
	for i := 0; i < 10; i++ {
		sum += i
	}
	fmt.Println(sum)
}

Базовый цикл for состоит из трех компонентов, разделенных точкой с запятой:

  • блок инициализации: выполняется перед первой итерацией;
  • условный блок: выполняется перед каждой итерацией;
  • завершающий блок: выполняется в конце каждой итерации.

Блок инициализации, как правило, содержит краткое объявление переменных, которые доступны только в области видимости цикла for.
Цикл прекратит итерации, как только значение логического выражения в условном блоке будет false.
В отличие от таких языков как C, Java или Javascript блоки конструкции for не заключаются в круглые скобки, а фигурные скобки { } обязательны.

Блоки инициализации и завершения опциональны.

package main

import "fmt"

func main() {
	sum := 1
	for ; sum < 1000; {
		sum += sum
	}
	fmt.Println(sum)
}

For в Go можно использовать как while в С, для этого нужно опустить точки с запятой:

package main

import "fmt"

func main() {
	sum := 1
	for sum < 1000 {
		sum += sum
	}
	fmt.Println(sum)
}

Если опустить условный блок, то получится компактная запись бесконечного цикла.

package main

func main() {
	for {
	}
}

В Go, также как и в операторах цикла for, выражение условного блока оператора if не нужно заключать в круглые скобки ( ), но фигурные скобки { } обязательны.

package main

import (
	"fmt"
	"math"
)

func sqrt(x float64) string {
	if x < 0 {
		return sqrt(-x) + "i"
	}
	return fmt.Sprint(math.Sqrt(x))
}

func main() {
	fmt.Println(sqrt(2), sqrt(-4))
}

Так же как и for, оператор if может начинаться с инструкции, которая будет выполнена перед проверкой условия. Доступность переменных, объявленных в этом блоке, только до конца области видимости оператора if.

package main

import (
	"fmt"
	"math"
)

func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	}
	return lim
}

func main() {
	fmt.Println(
		pow(3, 2, 10),
		pow(3, 3, 20),
	)
}

Переменные объявленные внутри краткой инструкции if также доступны внутри всех блоков else:

 func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	} else {
		fmt.Printf("%g >= %g\n", v, lim)
	}
	// can't use v here, though
	return lim
}

Реализация алгоритма извлечения квадратного корня методом последовательного приближения:

package main

import (
	"fmt"
	"math"
)

func Sqrt(x float64) float64 {
	a0 := 0.0
	a := 0.0
	s := 0.0

	for s < x {
		a0 = a
		a = a + 1
		s = a * a
	}

	if x == s {
		return a
	}

	a = a0
	s = a * a
	for s < x {
		a0 = a
		a = a + 0.00001
		s = a * a
	}
	if x == s {
		return a
	}

	return a0

}

func main() {
	fmt.Println(Sqrt(26))
	fmt.Println(math.Sqrt(26))
}

5.099009999996252
5.0990195135927845

Оператор switch - это более короткий способ написать последовательность операторов if-else. Оператор switch отличает от аналогичного оператора в языках C, C ++, Java отсутствие оператора break в блоке case. Выполняется только первый блок case отвечающий условию, если он не заканчивается оператором fallthrough. Условия блоков case проверяются сверху вниз.
Другое важное различие заключается в том, что условие (switch) в Go не обязательно должно быть константой, а значения (case) не обязательно должны быть целые числа.
Switch без условия это тоже самое, что и switch true. Эта конструкция может быть использована как более ясный способ записи длинной цепочки if-then-else.
Оператор defer откладывает выполнение функции до того момента, пока не выполнятся все остальные инструкции в возвращаемой функции. Аргументы отложенных вызовов вычисляются сразу.
Отложенные функций переносятся в стек. Когда происходит возврат из функции, ее отложенные вызовы выполняются в порядке “последним-пришел-первым-вышел”.

Go to Golang tutorial