V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  defia  ›  全部回复第 6 页 / 共 7 页
回复总数  136
1  2  3  4  5  6  7  
2014-11-30 14:23:14 +08:00
回复了 loveyu 创建的主题 分享发现 好久不见 ip138,居然变这样
是搜狗问问被人跨站啦..
可能是色彩空间问题 你的看图软件有问题啦
2014-11-16 23:30:16 +08:00
回复了 qq2511296 创建的主题 问与答 Magic Mouse 太耗电了,想买个充电的电池,有推荐的吗?
磷酸锂铁+站位桶也很轻.而且相当便宜..跟eneloop比起来简直白菜价
所以其实内联函数/匿名函数,本身跟普通的命名函数是完全一回事的
@snachx 编译器优化啦

package main

import "fmt"

func main() {
for i := 0; i < 3; i++ {
a := []string{"str"}
fmt.Printf("%p\n", a)
}
}
这样就是3个不同值

package main

import "fmt"

func main() {
for i := 0; i < 3; i++ {
a := func() {}
fmt.Printf("%p\n", a)
}
}

这样就是三个相同值..
可见编译器会对内联函数有优化.当然也很好理解,不然每个函数一套还调试个屁啊
@snachx 我也认为这个取决于编译器,而且指针是否一样在golang中意义并不大
1楼的代码在每次循环体时,执行了一个函数,其把循环变量i作为参数传递了进去并返回一个跟原文一样功能的函数,这样一来j就是复制传参了,最终就会返回123
后面range得到的f,是一个值,其类型为函数,同一个函数所以为同一个指针

f()即函数返回值

至于为什么3个返回值都是3,我们来分析一下函数本身:
func() int {

return i
}
这个函数为一个返回int的函数
返回的数值为i

在这里,i是闭包,记住一点,通过闭包获取的函数作用域之外(这里为函数内部引用外部)的外部变量,类似于指针,即在闭包内部作用域引用外部变量时,并非像传参一样复制外部的变量数值,而是保留了外部变量的引用,所以在内部使用外部变量时,该数值取决于执行时该外部变量的值

在执行f()的时候,上面的for循环已经结束,i的数值为3,所以最终3个结果都是3

同样的再来个例子:
func main() {
values := []string{"a", "b", "c"}
for _, v := range values {
go func() {
fmt.Println(v) //通过闭包传递了v的引用
}()
}
var input string
fmt.Scanln(&input)
fmt.Println("done")
}
该例子中,最终结果输出是3个"c",而非abc
因为在runtime.GOMAXPROCS()==1的情况下,3个goroutine的执行发生于阻塞时,即fmt.Scanln时,在这个时候循环已经结束,v=="c"

这点类似javascript

for(var i=0;i<5;i++){
var j=1;
setTimeout(function(){
console.log(i+' '+j)
},200);
j=2;
}
2014-10-07 17:28:28 +08:00
回复了 leungxh 创建的主题 问与答 用 tasker 监控网页内容变化并提醒
我还在奇怪 看了连接发现 这个tasker确实是安卓手机上的那个软件啊..为什么一定要手机上跑呢
1  2  3  4  5  6  7  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2140 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 28ms · UTC 04:53 · PVG 12:53 · LAX 21:53 · JFK 00:53
Developed with CodeLauncher
♥ Do have faith in what you're doing.