使用golang和并发性验证9x9数独板

使用golang和并发性验证9x9数独板,go,sudoku,Go,Sudoku,我通过在LeetCode上做编码问题来练习golang。我正在尝试解决一个简单的数独难题(它只是验证棋盘)。没有具有相同数字的行,没有具有相同数字的列,没有具有相同数字的3x3块。我正在尝试使用并发来学习围棋程序/通道/等等 我无法让等待组完成 导入( “同步” “fmt” ) func isValidSlice(slice[]byte,results chan您的goroutine无法调用wg.Done(),因为它们都等待在通道中添加它们的值。但是由于您只在wg.wait()之后使用通道中的值

我通过在LeetCode上做编码问题来练习golang。我正在尝试解决一个简单的数独难题(它只是验证棋盘)。没有具有相同数字的行,没有具有相同数字的列,没有具有相同数字的3x3块。我正在尝试使用并发来学习围棋程序/通道/等等

我无法让等待组完成

导入(
“同步”
“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,频道也可以被缓冲: