使用golang和并发性验证9x9数独板
我通过在LeetCode上做编码问题来练习golang。我正在尝试解决一个简单的数独难题(它只是验证棋盘)。没有具有相同数字的行,没有具有相同数字的列,没有具有相同数字的3x3块。我正在尝试使用并发来学习围棋程序/通道/等等 我无法让等待组完成使用golang和并发性验证9x9数独板,go,sudoku,Go,Sudoku,我通过在LeetCode上做编码问题来练习golang。我正在尝试解决一个简单的数独难题(它只是验证棋盘)。没有具有相同数字的行,没有具有相同数字的列,没有具有相同数字的3x3块。我正在尝试使用并发来学习围棋程序/通道/等等 我无法让等待组完成 导入( “同步” “fmt” ) func isValidSlice(slice[]byte,results chan您的goroutine无法调用wg.Done(),因为它们都等待在通道中添加它们的值。但是由于您只在wg.wait()之后使用通道中的值
导入(
“同步”
“fmt”
)
func isValidSlice(slice[]byte,results chan您的goroutine无法调用wg.Done()
,因为它们都等待在通道中添加它们的值。但是由于您只在wg.wait()
之后使用通道中的值,所以除了一个goroutine之外,所有goroutine都无法调用wg.Done()
实际上,您不需要WaitGroup,只需将其删除即可
其他意见:
您应该将defer wg.Done()
移动到isvalidlice
的第一行。在函数的最后一行调用defer没有多大意义
如果你想正确关闭频道,你只需要一个WaitGroup,你可以在一个额外的goroutine中这样做,见下面的例子
func-isValidSudoku(板[][]字节)bool{
// ...
fmt.Println(“到达这里”)
go func(){
wg.Wait()
关闭(c)
}()
fmt.Println(“从未到过这里”)
对于结果:=范围c{
如果!结果{
go func(){
对于u:=范围c{
}
}()
返回错误
}
}
返回真值
}
非常感谢。我不知道当消息发送到频道时,该频道会等待读取。我认为它就像一个缓冲区,刚刚将一些数据转储到其中。这使我更喜欢频道,因为我可以使用它进行同步。@ProgrammingRookie,频道也可以被缓冲: