golang foreach

for range

说明

1、for循环开始已经确认循环次数,在中间进行append,也不会对新加的进行循环
2、进行循环的是拷贝的副本,在range后面使用的是指针或者slice,在range的时候,t是从当前slice或者指针指向的是a[i],从case1和其他case的fmt.Print(t.n, " ")可以看出
3、要对当前数组或者slice,使用指针进行操作,在case3和case4可以看出

func main() {
	case1()
	case2()
	case3()
	case4()
	case5()
}

type T struct {
	n int
}

func case1() {
	a := [2]T{}
	// 复制一个数组时,次数组的所有元素被复制,t时同一个值,被赋值,开始进行for range的时候,已经拷贝一个a的副本进行循环
	for i, t := range a {
		switch i {
		case 0:
			t.n = 3
			//直接在a上面操作
			a[1].n = 9
		case 1:
			fmt.Print(t.n, "  ")
		}
	}
	fmt.Println(a)
}

func case2() {
	a := [2]T{}
	// 复制一个数组时,次数组的所有元素被复制,t时同一个值,被赋值,开始进行for range的时候,已经拷贝一个a的副本进行循环
	// 并且已经记录需要循环的个数,在for进行append,也不会循环新加的内容

	for i, t := range &a {
		switch i {
		case 0:
			t.n = 3
			a[1].n = 9
		case 1:
			fmt.Print(t.n, "  ")
		}
	}
	fmt.Println(a)
}

func case3() {
	a := [2]T{}
	// 复制一个数组时,次数组的所有元素被复制,t时同一个值,被赋值,开始进行for range的时候,已经拷贝一个a的副本进行循环
	// 并且已经记录需要循环的个数,在for进行append,也不会循环新加的内容
	for i := range a[:] {
		t := &a[i]
		switch i {
		case 0:
			t.n = 3
			a[1].n = 9
		case 1:
			fmt.Print(t.n, "  ")
		}
	}
	fmt.Println(a)
}

func case4() {
	a := [2]T{}
	for i := range a {
		t := &a[i]
		switch i {
		case 0:
			t.n = 3
			a[1].n = 9
		case 1:
			fmt.Print(t.n, "  ")
		}
	}
	fmt.Println(a)
}

func case5() {
	a := [2]T{}
	b := a[:]
	for i, t := range b {
		switch i {
		case 0:
			t.n = 3
			b[1].n = 9
			b = append(b, T{n: 4})
		case 1:
			fmt.Print(t.n, "  ")
		case 2:
			fmt.Print(t.n, "  ")
		}
	}
	fmt.Println(a)
	fmt.Println(b)
}

答案

0  [{0} {9}]
9  [{0} {9}]
9  [{3} {9}]
9  [{3} {9}]
9  [{0} {9}]
[{0} {9} {4}]


参考文档
参考老貘的for-range的用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值