반응형
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 range 은 무엇이며, 어떻게 사용할 수 있는지 간략히 알아보았습니다.
질문 >
Go 에서 range 은 무엇이며, 어떻게 사용할 수 있나요?
답변 >
Go에서 range는 반복문(for)과 함께 사용되는 키워드로, 슬라이스(slice), 배열(array), 맵(map), 채널(channel) 등의 자료 구조를 순회(iterate)할 때 사용됩니다. range를 사용하면 자료 구조 내의 요소들을 편리하게 접근할 수 있으며, 반복을 통해 인덱스나 키, 그리고 값에 접근할 수 있도록 도와줍니다.
다음은 Go에서 range를 사용하는 방법과 각 자료 구조에 대한 예시입니다.
1. 배열과 슬라이스에서 range 사용
배열이나 슬라이스를 순회할 때 range는 두 가지 값을 반환합니다:
- 인덱스: 현재 요소의 위치
- 값: 현재 요소의 값
예시 코드
package main
import "fmt"
func main() {
nums := []int{2, 4, 6, 8}
// 배열 또는 슬라이스 순회
for i, v := range nums {
fmt.Printf("Index: %d, Value: %d\\n", i, v)
}
// 인덱스만 필요할 경우
for i := range nums {
fmt.Printf("Index: %d\\n", i)
}
// 값만 필요할 경우 (인덱스 무시)
for _, v := range nums {
fmt.Printf("Value: %d\\n", v)
}
}
- i, v := range nums: i는 인덱스, v는 현재 인덱스의 값을 나타냅니다.
- _: 인덱스나 값을 무시하고 싶을 때 사용합니다.
2. 맵(map)에서 range 사용
맵을 순회할 때 range는 두 가지 값을 반환합니다:
- 키: 현재 요소의 키
- 값: 현재 키에 해당하는 값
예시 코드
package main
import "fmt"
func main() {
scores := map[string]int{"Alice": 95, "Bob": 80, "Charlie": 85}
// 맵 순회
for key, value := range scores {
fmt.Printf("Key: %s, Value: %d\\n", key, value)
}
// 키만 필요할 경우
for key := range scores {
fmt.Printf("Key: %s\\n", key)
}
// 값만 필요할 경우 (키 무시)
for _, value := range scores {
fmt.Printf("Value: %d\\n", value)
}
}
- 맵을 순회할 때 range는 요소의 순서를 보장하지 않습니다. 매번 실행 시 순회 순서가 달라질 수 있습니다.
3. 문자열(string)에서 range 사용
문자열을 순회할 때 range는 유니코드 코드 포인트(rune)를 기반으로 각 문자를 순회합니다.
- 인덱스: 현재 문자의 바이트 위치
- rune 값: 현재 문자의 유니코드 코드 포인트 값
예시 코드
package main
import "fmt"
func main() {
text := "hello"
for i, r := range text {
fmt.Printf("Index: %d, Rune: %c\\n", i, r)
}
}
- 문자열에서 range를 사용하면 유니코드 문자를 기준으로 순회하므로, 멀티바이트 문자가 포함된 문자열도 정상적으로 순회할 수 있습니다.
4. 채널(channel)에서 range 사용
채널을 순회할 때 range는 채널이 닫힐 때까지 값을 순회합니다. 이는 주로 고루틴(goroutine)과 함께 비동기 작업을 처리할 때 유용하게 사용됩니다.
예시 코드
package main
import "fmt"
func main() {
ch := make(chan int)
// 값을 채널에 보냄
go func() {
for i := 0; i < 5; i++ {
ch <- i
}
close(ch) // 채널 닫기
}()
// 채널 순회
for v := range ch {
fmt.Println("Value:", v)
}
}
- 채널이 닫히면 range는 자동으로 종료됩니다. 따라서 채널 순회를 마친 후에는 별도로 종료 조건을 작성할 필요가 없습니다.
- close(ch)로 채널을 닫아야만 range가 끝날 수 있습니다. 닫히지 않은 채널에서 계속 값을 기다리므로 무한 루프에 빠질 수 있습니다.
요약
자료 구조 | 반환 값 | 설명 |
배열/슬라이스 | 인덱스, 값 | 요소의 인덱스와 해당 값을 반환 |
맵 | 키, 값 | 요소의 키와 해당 값을 반환 |
문자열 | 인덱스, rune 값 | 문자의 바이트 위치와 유니코드 값 반환 |
채널 | 값 | 채널이 닫힐 때까지 채널에서 값을 반환 |
range는 Go의 다양한 자료 구조에서 반복 작업을 간편하게 수행할 수 있게 해주며, 각 자료 구조에 맞는 값을 반환하여 유연하게 사용할 수 있습니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
🎬 유튜브 채널 🎬
🎬 치지직 채널 🎬
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [Flutter] Flutter 의 기본 구성 구조는 어떻게 되나요? (3) | 2024.11.18 |
---|---|
👨💻 [Go] Go 에서 strings.Builder 은 무엇이며, 어떻게 사용할 수 있나요? (5) | 2024.11.15 |
👨💻 [Flutter] Flutter 에서 Widget 은 무엇인가요? (5) | 2024.11.15 |
👨💻 [Flutter] Flutter 에서 StatefulWidget 은 무엇인가요? (3) | 2024.11.15 |
👨💻 [Flutter] Flutter 에서 StatelessWidget 은 무엇인가요? (3) | 2024.11.15 |