Go语言里的那些坑(一)允许变量重复定义

package main

import "fmt"
import "math/rand"
import "unsafe"

func main() {
	a := 0
	for i := 0; i < 10; i++ {
		fmt.Println("start-->", a, unsafe.Pointer(&a))
		a := f()
		fmt.Println("end-->", a, unsafe.Pointer(&a))
	}
}

func f() (int) {
	return rand.Intn(100)
}

go run main.go
start--> 0 0xc0000b6010
end--> 81 0xc0000b6030
start--> 0 0xc0000b6010
end--> 87 0xc0000b6040
start--> 0 0xc0000b6010
end--> 47 0xc0000b6050
start--> 0 0xc0000b6010
end--> 59 0xc0000b6060
start--> 0 0xc0000b6010
end--> 81 0xc0000b6070
start--> 0 0xc0000b6010
end--> 18 0xc0000b6080
start--> 0 0xc0000b6010
end--> 25 0xc0000b6090
start--> 0 0xc0000b6010
end--> 40 0xc0000b60a0
start--> 0 0xc0000b6010
end--> 56 0xc0000b60b0
start--> 0 0xc0000b6010
end--> 0 0xc0000b60c0

package main

import "fmt"
import "math/rand"
import "unsafe"

func main() {
	a := 0
	for i := 0; i < 10; i++ {
		fmt.Println("start-->", a, unsafe.Pointer(&a))
		//a := f()
		a = f()
		fmt.Println("end-->", a, unsafe.Pointer(&a))
	}
}

func f() (int) {
	return rand.Intn(100)
}


go run main.go
start--> 0 0xc0000a4010
end--> 81 0xc0000a4010
start--> 81 0xc0000a4010
end--> 87 0xc0000a4010
start--> 87 0xc0000a4010
end--> 47 0xc0000a4010
start--> 47 0xc0000a4010
end--> 59 0xc0000a4010
start--> 59 0xc0000a4010
end--> 81 0xc0000a4010
start--> 81 0xc0000a4010
end--> 18 0xc0000a4010
start--> 18 0xc0000a4010
end--> 25 0xc0000a4010
start--> 25 0xc0000a4010
end--> 40 0xc0000a4010
start--> 40 0xc0000a4010
end--> 56 0xc0000a4010
start--> 56 0xc0000a4010
end--> 0 0xc0000a4010
这个坑在于变量a在第一段程序里面居然可以重复定义,还不报错!!!

打印start的时候,a指的是for循环外面定义的a;

打印end的时候,a指的是函数f返回的a

真是奇葩

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值