Golang——for循环的两种用法

Bryce · · 5450 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

从大一开始学C++,所接触过的for循环只有一种方式,for (int i = 0; i < count; i++) {...}。后来接触了Java,知道Java 5 引入了一种新特性,可以通过for (a : aa)遍历整个数组。虽然知道,但是也没用过,因为之前那种方法足够了。

现在主力语言是Go。Go也支持传统的写法for i := 0; i < count; i++ {...}。同样,还有一种for i, a := range aa {...}。这个跟Java相比,除了能够遍历,还能得到当前遍历的索引值,所以在Go中,更倾向于后面这种方法,令活动更高。

今天要对一个数据进行遍历,对每个元素进行稍加修改,才发现,原来这两种方式是有很大区别的。当时使用第二种方式修改之后,一直发现没有修改成功。后来进过调试,才发现是for循环的问题。

测试代码在这里

a := []string{}
a = append(a, "hello")
a = append(a, ", ")
a = append(a, "world")
fmt.Println(a)

for i := 0; i < len(a); i++ {
	fmt.Println(&a[i])
}

for _, aa := range a {
	aa += "@"
	fmt.Println(&aa)
}
for i := 0; i < len(a); i++ {
	a[i] += "@"
	fmt.Println(&a[i])
}
fmt.Println(a)

通过range方式获得的变量,打印出它的地址,和之前的数组a的地址相比,是不同的地址。

[hello ,  world]
0x10322280
0x10322288
0x10322290
0x1030e100
0x1030e100
0x1030e100
0x10322280
0x10322288
0x10322290
[hello@ , @ world@]

这里就可以证明,通过range方式获得的变量,和a[i]变量是不同的,只是里面存的值一样而已。所以,如果做出了修改操作,也不会修改到原来的数组。

果断再去看一下大Java的语法。结果也是一样的。

class TestFor {

	public static void main(String[] args) {
		String[] a = {"hello", ", ", "world"};
		System.out.println(a[0] + a[1] + a[2]);

		for (String aa : a) {
			aa += "@";
		}
		System.out.println(a[0] + a[1] + a[2]);
	}

}

如果遍历数组,还需要对数组元素进行操作,建议用传统for循环因为可以定义角标通过角标操作元素。如果只为遍历获取,可以简化成高级for循环,它的出现为了简化书写。

传统的for,写起来不太方便,但是功能强大;如果只是单纯得遍历,可以使用新的写法,简化代码。


######参考文献 + 【1】JAVA5.0新特性 - 子默

原文链接:Golang——for循环的两种用法,转载请注明来源!


有疑问加站长微信联系(非本文作者)

本文来自:Cyeam

感谢作者:Bryce

查看原文:Golang——for循环的两种用法

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5450 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传