예전에 작성했던 글에서 다뤘던 Go 루프문에서 사용되는 변수들이 같은 주소값을 가지는 문제가 1.22에서 해결될 예정이라고 한다.
GOEXPERIMENT
환경변수를 loopvar
로 설정해서 미리 확인해볼 수 있다.
package main
import "fmt"
type Sample struct {
Number int
}
func main() {
samples := []Sample{{1}, {2}, {3}}
pointers := []*Sample{}
for _, sample := range samples {
fmt.Printf("Number: %d, Address: %p\n", sample.Number, &sample)
pointers = append(pointers, &sample)
}
fmt.Println()
for _, pointer := range pointers {
fmt.Printf("Number: %d, Address: %p\n", pointer.Number, pointer)
}
}
$ go run main.go
Number: 1, Address: 0xc000114000
Number: 2, Address: 0xc000114000
Number: 3, Address: 0xc000114000
Number: 3, Address: 0xc000114000
Number: 3, Address: 0xc000114000
Number: 3, Address: 0xc000114000
당연한 얘기지만... 다 같은 주소값으로 출력된다.
$ GOEXPERIMENT=loopvar go run main.go
Number: 1, Address: 0xc0000120b0
Number: 2, Address: 0xc0000120d0
Number: 3, Address: 0xc0000120d8
Number: 1, Address: 0xc0000120b0
Number: 2, Address: 0xc0000120d0
Number: 3, Address: 0xc0000120d8
환경변수를 달고 실행했더니 이슈가 더이상 발생하지 않는다.
만약 이 이슈에 대비한 코드를 미리 작성해뒀다면 1.22 업데이트 후에도 굳이 수정할 필요는 없어보인다. GOEXPERIMENT
환경변수는 loopvar
이외에도 여러 옵션을 제공하며, 여기에서 확인할 수 있다.
왜 이제서야 수정하는지 모르겠다.