小编Lut*_*ion的帖子

延迟和命名的返回值如何在golang中起作用?

我刚开始学习golang,我得到了一个例子混淆有关使用推迟在golang博客文章更改名为返回值这里.

这个例子说:

  1. 延迟函数可以读取并分配给返回函数的命名返回值.

在此示例中,延迟函数在周围函数返回后递增返回值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的函数中?

请帮我确认一下,谢谢!

go

31
推荐指数
3
解决办法
2万
查看次数

使用PHP-FPM时如何从PHP扩展中捕获输出

我在PHP中加载了自定义C扩展,在扩展内部有一个函数做这样的事情

void a() {
    printf("abc");
}
Run Code Online (Sandbox Code Playgroud)

我可以a()在CLI模式(命令行)中调用没有问题,abc并按预期获得输出.但是当我在PHP-FPM模式的Yii项目中再次尝试时,我无法获得该输出.

我确信的是:

  • 扩展已加载.
  • 成功完成函数调用,没有错误.
  • PHP输出缓冲已关闭.我ob_end_clean()在调用之前调用a()了两次,第一次调用return true,第二次调用返回false.

所以我的问题是:

我应该从PHP-FPM模式的扩展中获得输出吗?

如果是这样,我如何捕获输出,或者请给我一些调试建议.

php php-extension

5
推荐指数
1
解决办法
237
查看次数

标签 统计

go ×1

php ×1

php-extension ×1