> 백엔드 개발 > Golang > golang에서 반복을 위해 범위를 사용하는 방법

golang에서 반복을 위해 범위를 사용하는 방법

PHPz
풀어 주다: 2023-04-18 15:40:31
원래의
623명이 탐색했습니다.

range는 배열, 슬라이스, 채널 등과 같은 컬렉션 유형을 반복하는 데 사용되는 Go 언어의 키워드입니다. range 키워드 구문을 사용하면 코드를 더 간결하고 명확하게 만들 수 있습니다. 범위를 사용하여 반복하는 경우 다양한 시나리오의 일부 세부 사항과 차이점에 주의해야 합니다.

  1. 배열 및 슬라이스 반복

배열 및 슬라이스를 반복할 때 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)
}
로그인 후 복사
  1. iterate map

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)
}
로그인 후 복사
  1. 문자열 반복

문자열을 반복할 때 range는 두 개의 값을 반환하며, 첫 번째 값은 문자의 인덱스입니다. 첫 번째 값은 문자의 인덱스입니다. 두 값은 이 인덱스의 문자 값입니다. 프로그램 컴파일 중에 문자열이 바이트 배열로 변환되므로 문자가 아닌 바이트가 반복된다는 점에 유의해야 합니다.

예:

str := "hello,世界!"
for index, ch := range str {
    fmt.Printf("index: %d, char: %c\n", index, ch)
}
로그인 후 복사
  1. 채널 반복

채널을 반복할 때 범위는 계속 차단되어 채널에서 콘텐츠를 읽을 때까지 기다립니다. 범위 루프는 채널이 닫히거나 읽기가 완료되면 종료됩니다. 범위 루프의 변수는 채널 값을 받아들이는 변수입니다.

예:

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:
        // 通道中没有值可读
    }
}
로그인 후 복사
  1. 루프 변수 재사용

루프 반복에 범위를 사용할 때 루프 변수 재사용 문제에 주의해야 합니다. 루프 내에서 변수를 사용하는 경우 새 변수에 복사해야 합니다. 그렇지 않으면 데이터 덮어쓰기 문제가 발생합니다.

예:

// 错误示例
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿