Go 루프 이슈는 1.22에서 해결될 예정

박재훈·2023년 11월 8일
0

GO

목록 보기
18/19

예전에 작성했던 글에서 다뤘던 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)
	}
}

실행1 (아무 조치 없음)

$ 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

당연한 얘기지만... 다 같은 주소값으로 출력된다.

실행2 (GOEXPERIMENT=loopvar)

$ 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 이외에도 여러 옵션을 제공하며, 여기에서 확인할 수 있다.
왜 이제서야 수정하는지 모르겠다.

Reference

profile
코딩 좋아합니다

0개의 댓글