带有goroutines问题的MergeSort算法

带有goroutines问题的MergeSort算法,go,Go,我是新手,我正在努力更好地理解这一点,尤其是在谈论goroutines 我在GitHub上发现了一个并行MergeSort算法,在研究这段代码时,我有一些问题,我想了解为什么要使用它,以及有没有办法将它转换为其他类型 第一个问题,为什么通道被用作struct{}而不是int[]或其他东西?有没有办法将其更改为int[]或任何其他类型 另一个问题是,为什么该算法使用go func()而不是为此创建新函数?有没有一种方法可以用其他函数实现它,并且只需在之前编写go关键字 最后一个问题是,何时使用de

我是新手,我正在努力更好地理解这一点,尤其是在谈论goroutines

我在GitHub上发现了一个并行MergeSort算法,在研究这段代码时,我有一些问题,我想了解为什么要使用它,以及有没有办法将它转换为其他类型

第一个问题,为什么通道被用作
struct{}
而不是
int[]
或其他东西?有没有办法将其更改为
int[]
或任何其他类型

另一个问题是,为什么该算法使用
go func()
而不是为此创建新函数?有没有一种方法可以用其他函数实现它,并且只需在之前编写
go
关键字

最后一个问题是,何时使用
default
case

    func MultiMergeSortWithSem(data []int, sem chan struct{}) []int {
    if len(data) < 2 {
        return data
    }

    middle := len(data) / 2

    var waitGroup sync.WaitGroup
    waitGroup.Add(2)

    var leftData []int
    var rightData []int

    select {
    case sem <- struct{}{}:
        go func() {
            leftData = MultiMergeSortWithSem(data[:middle], sem)
            <-sem
            waitGroup.Done()
        }()
    default:
        leftData = SingleMergeSort(data[:middle])
        waitGroup.Done()
    }

    select {
    case sem <- struct{}{}:
        go func() {
            rightData = MultiMergeSortWithSem(data[middle:], sem)
            <-sem
            waitGroup.Done()
        }()
    default:
        rightData = SingleMergeSort(data[middle:])
        waitGroup.Done()
    }

    waitGroup.Wait()
    return Merge(leftData, rightData)
}
func MultiMergeSortWithSem(数据[]int,结构{})[]int{
如果len(数据)<2{
返回数据
}
中间:=len(数据)/2
var waitGroup sync.waitGroup
waitGroup.Add(2)
var leftData[]int
var rightData[]int
挑选{
案例扫描电镜
第一个问题,为什么通道被用作struct{}而不是int[]
还是别的什么


struct{}
通常用作通道的类型,但实际类型并不重要,而是通道的写入和读取。因此,如果您只是需要某种形式的控制的编排,那么
struct{}
是一个可靠的选择,因为传递的数据不可能有用。

我想说,你的问题很难回答,因为它们实际上非常基本。这表明你的方法走错了方向:你应该尝试获得基本知识,然后再尝试处理更复杂的事情。请从开始。(还请注意,lanugage只被称为“Go”,其他什么都没有。)@kostix我知道它们简单而基本,实际上,我已经解决了第二个和第三个问题,但我仍然想知道第一个问题的答案,因为我不确定我是否完全理解
struct{}的用法
这里的数据是这样的:{1 8 2}{4 3 6}等等?