Oleg Alexandrov

for

Назад

for i := 1; i < 5; i++ {
    fmt.Println(i)
}

for i := 0; i < 15; i += 3 {
    fmt.Println(i)
}

for i := 100; i > 0; i -= 10 {
    fmt.Println(i)
}
var i = 1
for ; i < 5; i++ {
    fmt.Println(i)
}
i := 0
for fmt.Println("start"); i < 3; i++ {
    fmt.Println(i)
}
// start
// 0
// 1
// 2
for i := 0; i < 3; fmt.Println("after") {
    fmt.Println(i)
    i++
}
// 0
// after
// 1
// after
// 2
// after

While

var i = 1
for i < 10 {
    fmt.Println(i)
    i++
}
var v int = 39
for v != 0 {
     fmt.Println(v)
     if v > 16 {
         v /= 4
     } else {
         v /= 2
     }
}
// 39
// 9
// 4
// 2
// 1

Бесконечный цикл

for {
}

Range

for range "ticks" {
    fmt.Println("tick") // Print 5 time "tick"
}
for i, c := range "ticks" {
    fmt.Printf("%d: %q\n", i, c)
}
// 0: 't'
// 1: 'i'
// 2: 'c'
// 3: 'k'
// 4: 's'
var users = [3]string{"Tom", "Alice", "Kate"}

for index, value := range users {
    fmt.Println(index, value)
}

for index := range users {
    fmt.Println(index)
}

for _, value := range users{
    fmt.Println(value)
}
a := [...]string{"one", "two", "three", "four", "five"}
for i := range a {
    a[4] = "six"
    fmt.Printf("%d: %s\n", i, a[i])
}
nums := &[...]string{"one", "two", "three"}

for idx, num := range *nums {
    fmt.Printf("%d: %s\n", idx, num)
}
// 0: one
// 1: two
// 2: three

for idx, num := range nums {
    fmt.Printf("%d: %s\n", idx, num)
}
// 0: one
// 1: two
// 2: three

Map

m := map[string]int{"one": 1, "two": 2, "three": 3}

for range m {
     fmt.Println("loop")
}

for key, value := range m {
     fmt.Printf("key: %q, value: %d\n", key, value)
}

for key, _ := range m {
    fmt.Printf("key: %q\n", key)
}

for key := range m {
     fmt.Printf("key: %q\n", key)
}

for _ = range m {
    fmt.Println("b")
}

for _, _ = range m {
    fmt.Println("c")
}
// nil map
var m map[string]int
for range m { // цикл не будет выполнятся
    fmt.Println("foo")
}

Channel

ch := make(chan int, 1)
i := 0
for ch <- 1; i < 5; i++ {
    fmt.Println(i)
}
ch := make(chan int)
go func() {
    time.Sleep(3 * time.Second)
    ch <- 1
    time.Sleep(2 * time.Second)
    ch <- 2
    time.Sleep(time.Second)
    close(ch)
}()
fmt.Printf("before:\t\t%s\n", time.Now())

for v := range ch {
    fmt.Printf("tick #%d:\t%s\n", v, time.Now())
}
fmt.Printf("after:\t\t%s\n", time.Now())

// before:       2009-11-10 23:00:00 +0000 UTC m=+0.000000001
// tick #1:      2009-11-10 23:00:03 +0000 UTC m=+3.000000001
// tick #2:      2009-11-10 23:00:05 +0000 UTC m=+5.000000001
// after:        2009-11-10 23:00:06 +0000 UTC m=+6.000000001
ch := make(chan int)
close(ch)
for range ch {
    fmt.Println("tick")
}
fmt.Println("done!")

// It prints done! to stdout.
// nil channel
ch := make(chan int)
for range ch {
}

// или
var ch chan int
for range ch {
}

// fatal error: all goroutines are asleep - deadlock!

Break

outside:                       // declare the label
for i := 0; i<2; i++ {
    for j := 0; j<2; j++ {
        if i < j {
            break outside      // break to that label
        }
        fmt.Println(i, j)
    }
}
// prints 0 0

Continue

for i := 0; i<2; i++ {
    for j := 0; j<2; j++ {
        if i < j {
            continue
        }
        fmt.Println(i, j)
    }
}
// 0 0
// 1 0
// 1 1

Назад