[Golang]range 使用细节

1. range 表达式的值
当for语句被执行的时候,在range关键自右边的number1会先被求值(下面程式码)。而这个位置上的代码被称为range表达式。
range表达式的结果值可以是array、pointer to an array、slice、string、map、channel(channel permitting receive operations 比如:chan int or - chan<- int)。

package mainimport "fmt"func main() {numbers1 := [...]int{1, 2, 3, 4, 5, 6}for i, e := range numbers1 {fmt.Println(i,e)}fmt.Println()for i := range numbers1 {fmt.Println(i)}fmt.Println()}

https://play.golang.org/p/GDBWAZwZZ5N

numbers1 := [...]int{1, 2, 3, 4, 5, 6}for i, e := range numbers1

对于不同种类的range表达式结果值,for语句的变数,数量可以不一样。
number1是一个array,那变数就可以有两个,第一个变数是索引值(i),第二个变数是元素值(e)。

numbers1 := [...]int{1, 2, 3, 4, 5, 6}for i := range numbers1

在这个状况下,如果只写一个变数,得到的就会是索引值(i)。

2. slice为引用类型,array为值类型
值类型:变数直接储存值。(同属于值类型的包含,基础数据类型、结构体类型。)
引用类型:变数储存的是一个地址,而这个地址储存最终的值。(同属于引用类型的包含,字典、通道、函数类型。)

package mainimport "fmt"func main() {numbers1 := [...]int{1, 2, 3, 4, 5, 6}maxIndex1 := len(numbers1) - 1for i, e := range numbers1 {if i == maxIndex1 {numbers1[0] += e} else {numbers1[i+1] += e}}fmt.Println(numbers1)fmt.Println()numbers2 := []int{1, 2, 3, 4, 5, 6}maxIndex2 := len(numbers2) - 1for i, e := range numbers2 {if i == maxIndex2 {numbers2[0] += e} else {numbers2[i+1] += e}}fmt.Println(numbers2)}

https://play.golang.org/p/79dR8P2bQCW

参考来源

郝林-Go语言核心36讲


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章