4 basic range loop (for-each) patterns
source link: https://yourbasic.org/golang/for-loop-range-array-slice-map-channel/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
4 basic range loop (for-each) patterns
Basic for-each loop (slice or array)
a := []string{"Foo", "Bar"}
for i, s := range a {
fmt.Println(i, s)
}
0 Foo
1 Bar
- The range expression,
a
, is evaluated once before beginning the loop. - The iteration values are assigned to the respective iteration variables,
i
ands
, as in an assignment statement. - The second iteration variable is optional.
- For a nil slice, the number of iterations is 0.
String iteration: runes or bytes
For strings, the range loop iterates over Unicode code points.
for i, ch := range "日本語" {
fmt.Printf("%#U starts at byte position %d\n", ch, i)
}
U+65E5 '日' starts at byte position 0
U+672C '本' starts at byte position 3
U+8A9E '語' starts at byte position 6
- The index is the first byte of a UTF-8-encoded code point;
the second value, of type
rune
, is the value of the code point. - For an invalid UTF-8 sequence, the second value will be 0xFFFD, and the iteration will advance a single byte.
To loop over individual bytes, simply use a normal for loop and string indexing:
const s = "日本語" for i := 0; i < len(s); i++ { fmt.Printf("%x ", s[i]) }
e6 97 a5 e6 9c ac e8 aa 9e
Map iteration: keys and values
The iteration order over maps is not specified and is not guaranteed to be the same from one iteration to the next.
m := map[string]int{
"one": 1,
"two": 2,
"three": 3,
}
for k, v := range m {
fmt.Println(k, v)
}
two 2
three 3
one 1
- If a map entry that has not yet been reached is removed during iteration, this value will not be produced.
- If a map entry is created during iteration, that entry may or may not be produced.
- For a nil map, the number of iterations is 0.
Channel iteration
For channels, the iteration values are the successive values sent on the channel until closed.
ch := make(chan int)
go func() {
ch <- 1
ch <- 2
ch <- 3
close(ch)
}()
for n := range ch {
fmt.Println(n)
}
1
2
3
- For a nil channel, the range loop blocks forever.
Gotchas
Here are two traps that you want to avoid when using range loops:
Share:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK