Go에서 `range`를 `foreach`로 사용하는 방법
Grace Collins
Solutions Engineer · Leapcell

Key Takeaways
- Go는 배열, 슬라이스, 맵, 문자열 및 채널을 반복하는 데
range
키워드를 사용합니다. - Go에는 전통적인
foreach
가 없지만,range
는 관용적인 방식으로 동일한 목적을 수행합니다. - 사용자 정의
foreach
함수는 보다 동적인 시나리오를 위해 리플렉션을 사용하여 빌드할 수 있습니다.
Go에는 다른 언어와 같은 기본 제공 foreach
루프가 없습니다. 그러나 Go는 슬라이스, 배열, 맵, 문자열 및 채널과 같은 다양한 데이터 구조를 반복할 수 있도록 유사한 목적을 제공하는 강력한 for
루프를 range
키워드와 함께 제공합니다.
슬라이스 및 배열 반복
슬라이스 또는 배열과 함께 range
를 사용하면 각 요소의 인덱스와 값이 모두 반환됩니다.
package main import "fmt" func main() { numbers := []int{1, 2, 3, 4, 5} for index, value := range numbers { fmt.Printf("Index: %d, Value: %d\n", index, value) } }
인덱스가 필요하지 않은 경우 빈 식별자 _
를 사용하여 생략할 수 있습니다.
for _, value := range numbers { fmt.Println(value) }
맵 반복
맵과 함께 range
를 사용하면 키-값 쌍을 반복할 수 있습니다.
fruits := map[string]string{ "a": "apple", "b": "banana", } for key, value := range fruits { fmt.Printf("%s -> %s\n", key, value) }
맵에 대한 반복 순서는 보장되지 않으며 반복마다 다를 수 있습니다.
문자열 반복
문자열을 반복할 때 range
는 해당 위치의 인덱스와 rune(유니코드 코드 포인트)을 반환합니다.
for index, char := range "GoLang" { fmt.Printf("Character at byte position %d: %c\n", index, char) }
이 접근 방식은 UTF-8 인코딩된 문자열에서 멀티바이트 문자를 올바르게 처리합니다.
채널 반복
range
는 채널이 닫힐 때까지 채널에서 값을 수신하는 데 사용할 수도 있습니다.
ch := make(chan int) go func() { for i := 0; i < 5; i++ { ch <- i } close(ch) }() for val := range ch { fmt.Println(val) }
이 패턴은 채널이 명시적으로 닫혔는지 확인할 필요 없이 채널에서 읽는 데 유용합니다.
사용자 정의 foreach
구현
Go의 range
가 대부분의 반복 요구 사항을 충족하지만 개발자는 리플렉션을 사용하여 슬라이스의 각 요소에 함수를 적용하는 사용자 정의 foreach
함수를 만들었습니다.
func ForEach(slice interface{}, fn func(interface{})) { v := reflect.ValueOf(slice) for i := 0; i < v.Len(); i++ { fn(v.Index(i).Interface()) } }
이 접근 방식을 사용하면 해당 유형에 관계없이 슬라이스의 각 요소에 함수를 적용할 수 있습니다.
결론
Go에는 전통적인 foreach
루프가 없지만 range
키워드가 있는 for
루프는 다양한 데이터 구조를 반복하는 다양하고 효율적인 방법을 제공합니다. range
를 효과적으로 이해하고 활용하면 깔끔하고 관용적인 Go 코드를 작성할 수 있습니다.
FAQs
아니요, Go에는 foreach
키워드가 없습니다. 대신 range
가 있는 for
를 사용하여 유사한 기능을 수행합니다.
예, range
는 맵(키-값 쌍을 가져오기 위해)과 채널(닫힐 때까지 값을 수신하기 위해)에서 작동합니다.
아니요, 맵에 대한 반복 순서는 무작위로 지정되며 실행 간에 일관성이 없습니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하십시오. 요청이나 요금이 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하십시오.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 고도의 동시성을 쉽게 처리할 수 있는 자동 확장.
- 운영 오버헤드가 없으므로 구축에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ