> 백엔드 개발 > Golang > Go 언어에서 range 키워드를 사용하는 방법

Go 언어에서 range 키워드를 사용하는 방법

青灯夜游
풀어 주다: 2023-01-18 15:16:47
원래의
1970명이 탐색했습니다.

Go 언어에서 range 키워드는 for 루프에서 배열, 슬라이스, 채널 또는 집합의 요소를 반복하는 데 사용됩니다. "for range" 구조는 배열 및 슬라이스에서 다른 언어의 foreach 문과 유사합니다. 요소의 인덱스를 반환합니다. 인덱스에 해당하는 값은 컬렉션의 "키-값" 쌍을 반환합니다. 구문은 "for key, value := range data{//}"입니다.

Go 언어에서 range 키워드를 사용하는 방법

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

Go 언어 범위(Range)

Go 언어의 range 키워드는 for 루프에서 배열, 슬라이스, 채널 또는 맵의 요소를 반복하는 데 사용됩니다. 배열과 슬라이스에서는 요소의 인덱스와 인덱스에 해당하는 값을 반환하고, 컬렉션에서는 키-값 쌍을 반환합니다.

매핑의 경우 다음 키-값 쌍을 반환합니다. Range는 하나의 값 또는 두 개의 값을 반환합니다. Range 표현식의 왼쪽에 하나의 값만 사용되는 경우 해당 값은 아래 표의 첫 번째 값입니다.

Go 언어의 for 루프에 대한 키-값은 다른 언어의 foreach 문과 유사한 for range 구문 형식을 사용합니다. ​​​​

Go 언어의 for range 루프에 대한 자세한 설명

Grammar

for key, value := range data{
    //
}
로그인 후 복사
for range 키워드입니다. for range 루프에서 반환된 키입니다. for range 루프에서 반환된 값의 복사본입니다. for 루프에 사용되는 range 키워드입니다. 순회해야 하는 범위 루프 데이터의 경우.
ParameterDescription
forfor
key
value
range
data

지침:

키만 읽으려는 경우 형식은 다음과 같습니다.

for key := range oldMap
로그인 후 복사

또는

for key, _ := range oldMap
로그인 후 복사
값만 읽으려는 경우 형식은 다음과 같습니다.
for _, value := range oldMap
로그인 후 복사

범위 루프용 Go 언어 설명데이터 유형keyvalueDescription문자열 인덱스문자값 복사 문자열에 해당하는 인덱스 키가 기록되지 않은 경우 인덱스는 배열의 인덱스인덱스에 해당하는 값의 복사본키가 다음과 같은 경우 기록되지 않은 경우 인덱스 슬라이스의 인덱스인덱스에 해당하는 값의 복사본키가 기록되지 않은 경우 인덱스의 키맵의 값은 키에 해당하는 값의 복사본을 반환합니다.키가 기록되지 않으면 맵의 값이 반환됩니다값은 채널에서 허용하는 데이터입니다
String
array
slice
map
channel

🎜

通过 for range 遍历的返回值有一定的规律:

  • 数组、切片、字符串返回索引和值。

  • map 返回键和值。

  • 通道(channel)只返回通道内的值。

遍历数组、切片——获得索引和值

在遍历代码中,key 和 value 分别代表切片的下标及下标对应的值,下面的代码展示如何遍历切片,数组也是类似的遍历方法:

for key, value := range []int{1, 2, 3, 4} {
    fmt.Printf("key:%d  value:%d\n", key, value)
}
로그인 후 복사

代码输出如下:

key:0  value:1
key:1  value:2
key:2  value:3
key:3  value:4
로그인 후 복사

遍历字符串——获得字符

Go语言和其他语言类似,可以通过 for range 的组合,对字符串进行遍历,遍历时,key 和 value 分别代表字符串的索引和字符串中的每一个字符。

下面这段代码展示了如何遍历字符串:

var str = "hello 你好"
for key, value := range str {
    fmt.Printf("key:%d value:0x%x\n", key, value)
}
로그인 후 복사

代码输出如下:

key:0 value:0x68
key:1 value:0x65
key:2 value:0x6c
key:3 value:0x6c
key:4 value:0x6f
key:5 value:0x20
key:6 value:0x4f60
key:9 value:0x597d
로그인 후 복사

代码中的变量 value,实际类型是 rune 类型,以十六进制打印出来就是字符的编码。

遍历 map——获得 map 的键和值

对于 map 类型来说,for range 遍历时,key 和 value 分别代表 map 的索引键 key 和索引对应的值,一般被称为 map 的键值对,因为它们是一对一对出现的,下面的代码演示了如何遍历 map。

m := map[string]int{
    "hello": 100,
    "world": 200,
}
for key, value := range m {
    fmt.Println(key, value)
}
로그인 후 복사

代码输出如下:

hello 100
world 200
로그인 후 복사

注意

对 map 遍历时,遍历输出的键值是无序的,如果需要有序的键值对输出,需要对结果进行排序。

遍历通道(channel)——接收通道数据

for range 可以遍历通道(channel),但是通道在遍历时,只输出一个值,即管道内的类型对应的数据。

下面代码为我们展示了通道的遍历:

c := make(chan int)
go func() {
    c <- 1
    c <- 2
    c <- 3
    close(c)
}()
for v := range c {
    fmt.Println(v)
}
로그인 후 복사

代码说明如下:

  • 第 1 行创建了一个整型类型的通道。

  • 第 3 行启动了一个 goroutine,其逻辑的实现体现在第 5~8 行,实现功能是往通道中推送数据 1、2、3,然后结束并关闭通道。

  • 这段 goroutine 在声明结束后,在第 9 行马上被执行。

  • 从第 11 行开始,使用 for range 对通道 c 进行遍历,其实就是不断地从通道中取数据,直到通道被关闭。

在遍历中选择希望获得的变量

在使用 for range 循环遍历某个对象时,一般不会同时需要 key 或者 value,这个时候可以采用一些技巧,让代码变得更简单,下面将前面的例子修改一下,参考下面的代码示例:

m := map[string]int{
    "hello": 100,
    "world": 200,
}
for _, value := range m {
    fmt.Println(value)
}
로그인 후 복사

代码输出如下:

100
200
로그인 후 복사

在上面的例子中将 key 变成了下划线_,这里的下划线就是匿名变量。

  • 可以理解为一种占位符。

  • 匿名变量本身不会进行空间分配,也不会占用一个变量的名字。

  • 在 for range 可以对 key 使用匿名变量,也可以对 value 使用匿名变量。

再看一个匿名变量的例子:

for key, _ := range []int{1, 2, 3, 4} {
    fmt.Printf("key:%d \n", key)
}
로그인 후 복사

代码输出如下:

key:0
key:1
key:2
key:3
로그인 후 복사

在该例子中,value 被设置为匿名变量,只使用 key,而 key 本身就是切片的索引,所以例子输出索引。

我们总结一下 for 的功能:

  • Go语言的 for 包含初始化语句、条件表达式、结束语句,这 3 个部分均可缺省。

  • for range 支持对数组、切片、字符串、map、通道进行遍历操作。

  • 在需要时,可以使用匿名变量对 for range 的变量进行选取。

【相关推荐:Go视频教程编程教学

위 내용은 Go 언어에서 range 키워드를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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