📜  Go语言-范围(1)

📅  最后修改于: 2023-12-03 14:41:37.329000             🧑  作者: Mango

Go语言-范围

范围在Go语言中是一个非常常用的构造,它可以用于数组、切片、字符串、map以及自定义类型等。范围可以遍历容器中的元素,并对其进行操作。下面我们来看一些范围的用法和注意事项。

数组范围
package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    for i, v := range arr {
        fmt.Printf("arr[%d]=%d\n", i, v)
    }
}

上面的代码定义了一个长度为5的整型数组,并使用范围来遍历并输出其元素。输出结果如下:

arr[0]=1
arr[1]=2
arr[2]=3
arr[3]=4
arr[4]=5
切片范围
package main

import "fmt"

func main() {
    s := []string{"foo", "bar", "baz"}
    for i, v := range s {
        fmt.Printf("s[%d]=%s\n", i, v)
    }
}

上面的代码定义了一个字符串切片,并使用范围来遍历并输出其元素。输出结果如下:

s[0]=foo
s[1]=bar
s[2]=baz
字符串范围
package main

import "fmt"

func main() {
    str := "Hello, 世界"
    for i, c := range str {
        fmt.Printf("str[%d]=%c\n", i, c)
    }
}

上面的代码定义了一个字符串,并使用范围来遍历并输出其字符。输出结果如下:

str[0]=H
str[1]=e
str[2]=l
str[3]=l
str[4]=o
str[5]=,
str[6]=
str[7]=世
str[10]=界

需要注意的是,在Go语言中,字符串是以UTF-8编码的字节数组表示的,因此在遍历字符串时,需要使用range来获取每个字符的UTF-8编码值,然后再通过% c格式化输出。

map范围
package main

import "fmt"

func main() {
    m := map[string]int{"foo": 1, "bar": 2, "baz": 3}
    for k, v := range m {
        fmt.Printf("m[%s]=%d\n", k, v)
    }
}

上面的代码定义了一个字符串到整型的map,并使用范围来遍历并输出其键值对。输出结果如下:

m[foo]=1
m[bar]=2
m[baz]=3
自定义类型范围
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

type People []Person

func (p People) Len() int {
    return len(p)
}

func (p People) Less(i, j int) bool {
    return p[i].Age < p[j].Age
}

func (p People) Swap(i, j int) {
    p[i], p[j] = p[j], p[i]
}

func main() {
    people := People{{"Bob", 31}, {"Alice", 29}, {"Eve", 21}}
    for i, v := range people {
        fmt.Printf("people[%d]=%v\n", i, v)
    }
}

上面的代码定义了一个自定义类型People,包含了一个Person的切片,并为其实现了sort.Interface接口。通过实现sort.Interface接口,我们可以使用sort包中的函数对People进行排序。然后,我们在main函数中使用范围来遍历并输出People中的元素。

输出结果如下:

people[0]={Bob 31}
people[1]={Alice 29}
people[2]={Eve 21}

需要注意的是,我们自定义的类型必须实现sort.Interface接口的三个方法:Len、 Less和Swap,才能使用sort包中的排序函数进行排序。

总结一下,范围是一个非常好用的语言构造,可以用于遍历数组、切片、字符串、map以及自定义类型等。通过范围,我们可以很方便地操作容器中的元素,并进行相应的处理。