range는 배열, 슬라이스, 채널 등과 같은 컬렉션 유형을 반복하는 데 사용되는 Go 언어의 키워드입니다. range 키워드 구문을 사용하면 코드를 더 간결하고 명확하게 만들 수 있습니다. 범위를 사용하여 반복하는 경우 다양한 시나리오의 일부 세부 사항과 차이점에 주의해야 합니다.
배열 및 슬라이스를 반복할 때 range는 인덱스와 요소 값이라는 두 가지 값을 반환합니다. _ 자리 표시자를 사용하여 값 중 하나를 생략할 수 있습니다.
예:
arr := [5]int{1, 2, 3, 4, 5} for index, value := range arr { fmt.Printf("index: %d, value: %d\n", index, value) } sli := []string{"hello", "world", "golang"} for i, v := range sli { fmt.Printf("i: %d, v: %s\n", i, v) }
배열이나 슬라이스를 반복할 때 인덱스나 요소 값만 필요한 경우 _ 자리 표시자를 사용하여 해당 변수를 무시할 수 있습니다. 예:
arr := [5]int{1, 2, 3, 4, 5} for index, _ := range arr { fmt.Printf("index: %d\n", index) } sli := []string{"hello", "world", "golang"} for i := range sli { fmt.Printf("i: %d\n", i) }
map을 반복할 때 range는 키와 값이라는 두 가지 값을 반환합니다. 배열과의 차이점은 인덱스와 요소 값 대신 키-값 쌍이 반환된다는 것입니다.
예:
m := map[string]int{"a":1, "b":2, "c":3} for key, value := range m { fmt.Printf("key: %s, value: %d\n", key, value) }
맵을 반복할 때 _를 사용할 수도 있습니다. 값 중 하나를 무시하세요.
m := map[string]int{"a":1, "b":2, "c":3} for k := range m { fmt.Println("key:", k) }
문자열을 반복할 때 range는 두 개의 값을 반환하며, 첫 번째 값은 문자의 인덱스입니다. 첫 번째 값은 문자의 인덱스입니다. 두 값은 이 인덱스의 문자 값입니다. 프로그램 컴파일 중에 문자열이 바이트 배열로 변환되므로 문자가 아닌 바이트가 반복된다는 점에 유의해야 합니다.
예:
str := "hello,世界!" for index, ch := range str { fmt.Printf("index: %d, char: %c\n", index, ch) }
채널을 반복할 때 범위는 계속 차단되어 채널에서 콘텐츠를 읽을 때까지 기다립니다. 범위 루프는 채널이 닫히거나 읽기가 완료되면 종료됩니다. 범위 루프의 변수는 채널 값을 받아들이는 변수입니다.
예:
ch := make(chan int, 10) go func() { for i := 0; i < 10; i++ { ch <- i } close(ch) }() for val := range ch { fmt.Println("value:", val) }
채널을 사용할 때 채널의 값을 읽지 않으면 프로그램이 정지된다는 사실에 특별한 주의가 필요합니다. 버퍼링된 채널을 사용하거나 select 문을 사용하여 이 문제를 해결할 수 있습니다.
버퍼 채널 예:
ch := make(chan int, 10) go func() { for i := 0; i < 10; i++ { ch <- i } close(ch) }() for { select { case val, ok := <-ch: if !ok { return } fmt.Println("value:", val) default: // 通道中没有值可读 } }
루프 반복에 범위를 사용할 때 루프 변수 재사용 문제에 주의해야 합니다. 루프 내에서 변수를 사용하는 경우 새 변수에 복사해야 합니다. 그렇지 않으면 데이터 덮어쓰기 문제가 발생합니다.
예:
// 错误示例 sli := []int{1, 2, 3} for _, v := range sli { go func() { fmt.Println(v) // 输出结果都是 3 }() } // 正确示例 sli := []int{1, 2, 3} for _, v := range sli { val := v // 复制变量 go func() { fmt.Println(val) }() }
간단히 말하면 range는 Go 언어의 매우 실용적인 키워드로 컬렉션의 요소를 반복하는 데 도움이 될 수 있습니다. range를 사용할 때는 다양한 유형의 컬렉션을 반복할 때 반환 값의 차이와 루프 변수 재사용 문제에 주의해야 합니다.
위 내용은 golang에서 반복을 위해 범위를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!