📅  最后修改于: 2023-12-03 14:41:37.329000             🧑  作者: Mango
范围在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格式化输出。
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以及自定义类型等。通过范围,我们可以很方便地操作容器中的元素,并进行相应的处理。