如何在for循环中的GoRoutine中'break'或'continue'?
How to 'break' or 'continue' in GoRoutine in for loop?
我是 golang 菜鸟。
我想在包含在 for 循环中的 GoRoutine 中中断或继续。
下面是我的代码
for i, m := range something {
go func(i int, m someModel){
if m.Name == "AAA" {
continue; // Here occurs error
}
// Do something
// which is very long....
}
}
在 vsCode 中,错误提示 “continue not in for statement”。
我知道可以通过(if ~ else)语句轻松解决,
但是我代码中的 'else' 部分太长了,这让代码看起来很脏。
我只是想知道是否有其他方法可以解决这个问题。
谢谢。
我自己解决了...
'return' 确实适用于这种情况。
但是WaitGroup.Done()之前必须进行。
修改后的代码如下
var wg sync.WaitGroup
wg.Add(mySize)
for i, m := range something {
go func(i int, m someModel){
defer wg.Done() // must be before return
if m.Name == "AAA" {
return
}
// Do something
// which is very long....
}
}
希望有人能得到帮助。
函数运行 go
语句会脱离主线程上下文,所以这里不能使用continue
语句。有两种方法可以实现您的目标
第一种方式是通过go语句启动函数,函数里面判断是否满足继续执行的条件,return语句结束Routine
for i, m := range something {
go func(i int, m someModel){
if m.Name == "AAA" {
return // use return
}
// Do something
// which is very long....
}
}
第二种方式是通过go语句在函数启动前查看数据。如果不满足启动要求,可以通过continue语句跳过。
for i, m := range something {
if m.Name == "AAA" {
continue // Check before start
}
go func(i int, m someModel){
// Do something
// which is very long....
}
}
从你的代码上下文推断,我推荐你第二种
我是 golang 菜鸟。 我想在包含在 for 循环中的 GoRoutine 中中断或继续。
下面是我的代码
for i, m := range something {
go func(i int, m someModel){
if m.Name == "AAA" {
continue; // Here occurs error
}
// Do something
// which is very long....
}
}
在 vsCode 中,错误提示 “continue not in for statement”。
我知道可以通过(if ~ else)语句轻松解决,
但是我代码中的 'else' 部分太长了,这让代码看起来很脏。
我只是想知道是否有其他方法可以解决这个问题。
谢谢。
我自己解决了...
'return' 确实适用于这种情况。
但是WaitGroup.Done()之前必须进行。
修改后的代码如下
var wg sync.WaitGroup
wg.Add(mySize)
for i, m := range something {
go func(i int, m someModel){
defer wg.Done() // must be before return
if m.Name == "AAA" {
return
}
// Do something
// which is very long....
}
}
希望有人能得到帮助。
函数运行 go
语句会脱离主线程上下文,所以这里不能使用continue
语句。有两种方法可以实现您的目标
第一种方式是通过go语句启动函数,函数里面判断是否满足继续执行的条件,return语句结束Routine
for i, m := range something {
go func(i int, m someModel){
if m.Name == "AAA" {
return // use return
}
// Do something
// which is very long....
}
}
第二种方式是通过go语句在函数启动前查看数据。如果不满足启动要求,可以通过continue语句跳过。
for i, m := range something {
if m.Name == "AAA" {
continue // Check before start
}
go func(i int, m someModel){
// Do something
// which is very long....
}
}
从你的代码上下文推断,我推荐你第二种