Basic implementation of suffix in Go
There is no need to create a new string at each iteration. You can directly append the subslice to the array like this: 

arr = append(arr, str[i:])


An other easy optimisation would be to create an array with the correct capacity to save an allocation at each iteration, as we know that arr will have the same length as str: 

arr := make([]string, len(str))


so the code can now be rewritten like this: 

func new() {
    str := "Hello"

    arr := make([]string, 0, len(str))
    for i := len(str) - 1; i &gt;= 0; i-- {
        arr = append(arr, str[i:])
    }
}


Running a small benchmark comparing the old and the new implementation, we get this result: 

goos: linux
goarch: amd64
BenchmarkOld-2           3000000               553 ns/op             240 B/op          4 allocs/op
BenchmarkNew-2          10000000               127 ns/op              80 B/op          1 allocs/op