我刚开始学习golang,我得到了一个例子混淆有关使用推迟在golang博客文章更改名为返回值这里.
这个例子说:
- 延迟函数可以读取并分配给返回函数的命名返回值.
在此示例中,延迟函数在周围函数返回后递增返回值i.因此,此函数返回2:
func c() (i int) {
defer func() { i++ }()
return 1
}
Run Code Online (Sandbox Code Playgroud)
但正如我从A Tour of Go中学到 的 - 命名的回报值
不带参数的return语句返回指定的返回值.这被称为"裸体"回归.
我在下面的代码和函数b中测试它返回1,因为它不是上面提到的没有参数的A return语句.
func a() (i int) { // return 2
i = 2
return
}
func b() (i int) { // return 1
i = 2
return 1
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是在第一个例子中,周围的函数c有一个命名的返回值i,但函数c使用return 1,在第二个例子中我们可以看到它应该返回1,无论我是什么值.但是为什么在我更改延迟函数后,c函数返回i的值而不是值1?
当我输入我的问题时,我可能已经猜到了答案.是因为
return 1
Run Code Online (Sandbox Code Playgroud)
等于
i = 1
return
Run Code Online (Sandbox Code Playgroud)
在具有命名返回值变量i的函数中?
请帮我确认一下,谢谢!
我在PHP中加载了自定义C扩展,在扩展内部有一个函数做这样的事情
void a() {
printf("abc");
}
Run Code Online (Sandbox Code Playgroud)
我可以a()
在CLI模式(命令行)中调用没有问题,abc
并按预期获得输出.但是当我在PHP-FPM模式的Yii项目中再次尝试时,我无法获得该输出.
我确信的是:
ob_end_clean()
在调用之前调用a()
了两次,第一次调用return true
,第二次调用返回false
.所以我的问题是:
我应该从PHP-FPM模式的扩展中获得输出吗?
如果是这样,我如何捕获输出,或者请给我一些调试建议.