在下面这段代码中,我希望输出为0,1,2,3,...,9.但是,只产生输出10,10,...,10.
package main
import "fmt"
func adder() []func() {
out := []func(){}
for i := 0; i < 10; i++ {
out = append(out, func() { fmt.Println(i) })
}
return out
}
func main() {
out := adder()
for i := 0; i < 10; i++ {
out[i]()
}
}
Run Code Online (Sandbox Code Playgroud)
我的心理模型表明,每次在for循环中都会生成并存储一个新函数,但似乎并非如此.有没有一个解决方案来生成新的功能而不修改签名(没有参数或全局变量),但仍保持i的当前值?
通过阅读 Stack Overflow 上有关同步与异步的一些帖子,看来异步应该具有较小的开销,或者比阻塞 I/O 操作的同步调用更快:
我研究过的一些地方: 非阻塞 I/O 真的比多线程阻塞 I/O 更快吗?如何? Javascript 异步函数的开销是多少
我写了一个小型基准测试,制作 4 个 256MB 到 1GB 的文件来查看fs.readFile().
const {performance} = require('perf_hooks');
const fs = require('fs');
const {execSync} = require("child_process");
const sizes = [512, 1024, 256, 512]; //file sizes in MiB
function makeFiles() {
for (let i = 0; i < sizes.length; i++) {
execSync(`dd if=/dev/urandom of=file-${i}.txt bs=1M count=${sizes[i]}`, (error, stdout, stderr) => {
console.log(`stdout: ${stdout}`);
});
}
}
function syncTest() {
const startTime = …Run Code Online (Sandbox Code Playgroud)