使用goroutine从通道获取意外数据

A piece of code from tutorials on tour.golang.org

package main

import "fmt"

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // send sum to c
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(s[:len(s)/2], c) //give 17
    go sum(s[len(s)/2:], c) //give -5
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
}

The output result is always -5 17 12 which means the first goroutine is stably behind the second. As my understanding to multithreading and channel, the order of result should be the opposite in this simple context.When the goroutine's task become more complexed the order should be unexpectable.So how to explain this LIFO like issue?