This is a real-world code review: Code should be correct, maintainable, robust, reasonably efficient, and, most importantly, readable.
Your code is not readable. Your code does not closely follow the pseudocode. For example, you deleted the n1 and n2 pseudocode variables:
n1 = q - p + 1
n2 = r - q
As a result, your code is very inefficient. Your code is off-by-one.
The Go Programming Language
Specification
Appending to and copying
slices
The variadic function append appends zero or more values x to s of
type S, which must be a slice type, and returns the resulting slice,
also of type S. ... If the capacity of s is not large enough to fit
the additional values, append allocates a new, sufficiently large
underlying array that fits both the existing slice elements and the
additional values. Otherwise, append re-uses the underlying array.
For left and right subarrays, you allocate slice with a capacity equal to the number of elements, then you immediately append a sentinel value. This allocates a new slice and copies the old values from the old slice to the new slice.
In my code, I renamed n1 and n2 to a more readable nLeft and nRight. In my code, I minimized the number and size of allocations.
A benchmark (1000 random elements) for my code
$ go test msort.go msort_test.go -bench=. -benchmem
BenchmarkMergeSort-4 18720 64849 ns/op 98048 B/op 999 allocs/op
versus a benchmark (1000 random elements) for your code
$ go test msort.go msort_test.go -bench=. -benchmem
BenchmarkMergeSort-4 6996 150493 ns/op 242880 B/op 3996 allocs/op