Language
range: 反復中にappendしても開始時の長さまでしか走査しない
rangeが対象にする反復回数は開始時に決まり、ループ中にappendした要素を追加で走査しません。
Sourceappend_during_range.go
Go 1.22
package loopexample
func VisitWhileAppending() (visited []int, final []int) {
values := []int{1, 2, 3}
for _, value := range values {
visited = append(visited, value)
values = append(values, value+10)
}
return visited, values
}Testappend_during_range_test.go
Go 1.22
package loopexample
import (
"reflect"
"testing"
)
func TestRange中にAppendしても反復回数は開始時の長さで固定される(t *testing.T) {
visited, final := VisitWhileAppending()
if want := []int{1, 2, 3}; !reflect.DeepEqual(visited, want) {
t.Fatalf("visited = %v, want %v", visited, want)
}
if want := []int{1, 2, 3, 11, 12, 13}; !reflect.DeepEqual(final, want) {
t.Fatalf("final = %v, want %v", final, want)
}
}01Assertion
このテストで確認できること
- [1, 2, 3]をrangeしながら各値へ10を足してappendする
- 走査済みの値は最初の3要素だけで、slice自体は6要素へ増える
range中に処理対象を増やしても、新しい要素を自動で処理するループにはなりません。ワークキューのように追加分まで処理したい場合は、添字とlenを明示的に管理するか、channelなど別の制御構造を選びます。
OBSERVED RESULT
visited: [1 2 3]
final: [1 2 3 11 12 13]