Sorting with different Algorithms
I'm not pretend to full review, but I guess better so than nothing. 


Golang allow swapping in one-line, so you can just do so:

arr[i-1],arr[i] = arr[i],arr[i-1]
Go does not have optional parameters nor does it support method overloading.So if you want implement more "usually" version of this sort - provide utility function which will take arguments for range:

// merge sort algorithm
func merge_sort(arr []int, l, r int) {
    if l &lt; r {
        m := (l + r) / 2
        mergeSort(arr, l, m)
        mergeSort(arr, m+1, r)
        merge(arr, l, m, r)
    }
}

func mergeSort(arr []int) {
    merge_sort(arr, 0, len(arr)-1)
}

In your current code very often used function append, it's not very effective. As example I just re-write C code from here and get:

func merge(arr []int, l, m, r int) {

    i := 0
    j := 0
    k := 0

    n1 := m - l + 1
    n2 := r - m
    L := make([]int, n1)
    R := make([]int, n2)
    for i &lt; n1 {
        L[i] = arr[l+i]
        i++
    }
    for j &lt; n2 {
        R[j] = arr[m+1+j]
        j++
    }

    i = 0
    j = 0
    k = l

    for i &lt; n1 &amp;&amp; j &lt; n2 {
        if L[i] &lt;= R[j] {
            arr[k] = L[i]
            i++
        } else {
            arr[k] = R[j]
            j++
        }
        k++
    }

    for i &lt; n1 {
        arr[k] = L[i]
        i++
        k++
    }

    for j &lt; n2 {
        arr[k] = R[j]
        j++
        k++
    }
}

About concurrent implementation - read this question and answers
and this one.