Go 1.22 release

go 가 1.22 버전이 추가 됐다.

가장 반길 부분은 loop에서 변수 캡쳐부분이다.

go를 처음 배울때 가장 의아 하면서도 이해가 잘안됐던 부분이지만 생각보다 인지를 하고 사용해야한다는 강박에 goroutine을 사용할때 방법을 생각 해야했었다.

쉽게 말하자면 

for i := 0; i < 10; i++ {
	go func() {
		fmt.Println(i)
	}()
}

 

위와 같은 프로그램을 실행 시킨다면 다른 언어에서는 순서는 보장하지 않지만 0,1,2,3,4,5,6,7,8,9 가 출력될 것이고 go에서도 그렇게 될거 같지만 그렇지 않다. 가장 나중의 i의 값이 캡쳐가 돼서 10이 10번 출력된다.

 

이를 해결 하기 위한 방법은 

i := i 이런식으로 재할당을 해주거나.

 

go func(i int) {

 

}(i)

 

이런식으로 goroutine이 실행할때 i값을 복사해서 새로운 값으로 사용하게 하는 방법으로 해결 할 수 있었다.

 

어떻게 바꼈는지 궁금 하다면 go play ground에서 확인해 보면된다.

 

https://go.dev/play/p/_6iLDV4bP3G?v=goprev

 

Go Playground - The Go Programming Language

Press Esc to move out of the editor. Loading share... About the Playground The Go Playground is a web service that runs on go.dev's servers. The service receives a Go program, vets, compiles, links, and runs the program inside a sandbox, then returns the o

go.dev

 

하지만 이제 1.22 버전에서는 다른 프로그램에서 기대한 값들이 출력이 되는 것이 수정이 됐고 이제 변수를 재할당 하지 않고 사용 할 수 있다.

 

https://go.dev/play/p/_6iLDV4bP3G

 

Go Playground - The Go Programming Language

Press Esc to move out of the editor. Loading share... About the Playground The Go Playground is a web service that runs on go.dev's servers. The service receives a Go program, vets, compiles, links, and runs the program inside a sandbox, then returns the o

go.dev

 

또한 바뀐점이 있는데 PGO 의 성능이 2~ 14% 정도 향상이 됐고, rand 함수가 새로 나왔다.

 

아직 실험 버전이라 릴리즈가 된다면 그때 다시 포스팅 하도록 해야겠다.

'개발 > Go' 카테고리의 다른 글

Retry 패키지  (0) 2023.10.31
[문법] 임시 구조체  (0) 2022.05.13
[gRPC/gRPC GATEWAY] json 필드 이름 proto 타입이름과 다를때  (0) 2022.05.12
[gRPC] message oneof 사용  (0) 2022.05.11