我正在尝试使用go例程以并行方式初始化项目数组。但是,即使我使用了建议的原语(通道),Go的奇怪的内存行为也阻止了我这样做。以下是最小复制:
List<String> personStr = Arrays.asList("1, Franck, 1980-01-01T00:00:00", "2, Marc, 1981-01-01T00:00:00");
List<Person> persons = personStr.stream()
.map(s -> s.replaceAll(" ", "").split(","))
.map(a -> new Person(Integer.parseInt(a[0]), a[1], LocalDateTime.parse(a[2])))
.collect(Collectors.toList());
该代码应该将.scss
数组初始化为0-9,但不会初始化。相反,将产生错误。我在Goland 2018.1上尝试了此代码
答案 0 :(得分:2)
由于代码是同时运行的,因此每次调用goroutine时都会修改变量def printSleeping():
sleep = "I'm sleeping"
v = ""
for i in sleep:
v += i
system('cls')
print v
time.sleep(0.02)
,因为它们都引用了相同的变量i
为防止这种情况发生,请将index参数传递给您的匿名函数。
i
另一种方法是使用以下声明样式
package main
import "fmt"
func main() {
toInit := make([]int, 10)
syncLock := make(chan bool)
for i := range toInit{
go func(i int){
toInit[i] = i;
syncLock <- true}(i)
}
for range toInit{
<-syncLock
}
for i := range toInit{
if toInit[i] != i{
fmt.Println("error")
}
}
}
的不错的文档