go中占位符号在代码中作用
range类似迭代器,可以遍历数组,字符串,map等等,对象的不同,返回的结果也不同。
range会复制对象,而不是不是直接在原对象上操作。
- 关键字 range 会返回两个值,第一个值是当前迭代到的索引位置,第二个值是该位置对应元素值的一份副本,如下图所示。
package main
import "fmt"
func main() {
// 这里我们使用range来计算一个切片的所有元素和
// 这种方法对数组也适用
nums := []int{2, 3, 4, 5, 6}
sum := 0
for t, num1 := range nums {
sum += num1
fmt.Printf("t = %d num = %d\n", t, num1)
}
fmt.Println("sum:", sum)
//本意计算切片数据的总和
nums2 := nums[:3]
fmt.Println("nums2 = ", nums2)
sum2 := 0
for num2 := range nums2 { //没有使用占位符号,错误赋值,获取到的是索引
sum2 += num2
fmt.Printf(" num2 = %d\n", num2)
}
fmt.Println("sum:", sum2)
nums3 := nums[:3]
fmt.Println("nums3 = ", nums3)
sum3 := 0
for _, num3 := range nums3 { // 将索引值赋值给占位符号_,进行了丢弃,
sum3 += num3
fmt.Printf("= %d, num3 = %d\n", num3)
}
fmt.Println("sum:", sum3)
// range 用来遍历数组和切片的时候返回索引和元素值
// 如果我们不要关心索引可以使用一个下划线(_)来忽略这个返回值
// 当然我们有的时候也需要这个索引
for i, num := range nums {
if num == 3 {
fmt.Println("index:", i)
}
}
// 使用range来遍历字典的时候,返回键值对。
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %s\n", k, v)
}
// range函数用来遍历字符串时,返回Unicode代码点。
// 第一个返回值是每个字符的起始字节的索引,第二个是字符代码点,
// 因为Go的字符串是由字节组成的,多个字节组成一个rune类型字符。
for i, c := range "go" {
fmt.Println(i, c)
}
}
输出结果
t = 0 num = 2
t = 1 num = 3
t = 2 num = 4
t = 3 num = 5
t = 4 num = 6
sum: 20
nums2 = [2 3 4]
num2 = 0
num2 = 1
num2 = 2
sum: 3 // 错误结果,本意计算元素的值,结果获取索引号,进行运算
nums3 = [2 3 4]
num3 = 2
num3 = 3
num3 = 4
sum: 9 //正确结果
index: 1
a -> apple
b -> banana
0 103
1 111