Хорошо, я понял, но когда я печатаю срез после добавления l oop, результаты добавления l oop каждый раз корректны, а окончательный отсортированный результат неверен. Помимо того, что я взял оба кода (неправильный и правильный), я расположил их так, чтобы они выглядели одинаково, и у меня все еще разный результат, единственное отличие состоит в том, что неправильный код полностью преобразуется в int и объединяется в 4 в исправьте один, они сначала сращены до 4, а затем преобразованы. Я могу представить, что добавление во втором решении сделано на маленьких кусочках, но все же. Я все еще в замешательстве, я все еще думаю, что есть какая-то проблема состояния гонки Пожалуйста, взгляните еще раз на эти два:
1- https://play.golang.org/p/-vOseYE1XLt
package main
import (
"fmt"
"sort"
"strconv"
)
func send(slice []int, c chan []int) {
sort.Ints(slice)
c <- slice
}
// Split strings.
func split(list []string) (tmpS []string, splS []string) {
tmpS = list[len(list)/2:]
splS = list[0 : len(list)/2]
return tmpS, splS
}
func convert(sStr []string) (sInt []int) {
for _, r := range sStr {
digit, _ := strconv.Atoi(r)
sInt = append(sInt, digit)
}
fmt.Println("Sorted sub array: ", sInt)
return sInt
}
func main() {
list := []string{"-9", "-11", "12", "13", "9"}
fmt.Println("Your unsorted digits: ", list)
splS1, splS2 := split(list)
splS11, splS12 := split(splS1)
splS21, splS22 := split(splS2)
// Convert each slices.
sInt1 := convert(splS11)
sInt2 := convert(splS12)
sInt3 := convert(splS21)
sInt4 := convert(splS22)
// Send in different go routines.
c := make(chan []int)
go send(sInt1, c)
go send(sInt2, c)
go send(sInt3, c)
go send(sInt4, c)
// Receive from a channel.
sortedS1 := <-c
sortedS2 := <-c
sortedS3 := <-c
sortedS4 := <-c
// Merge the 4 sorted slices.
sortedList1 := append(sortedS1, sortedS2...)
sortedList2 := append(sortedS3, sortedS4...)
finalList := append(sortedList1, sortedList2...)
// Sort it again
sort.Ints(finalList)
fmt.Println("Here your digits sorted: ", finalList)
}
2 - https://play.golang.org/p/L8WcrlTOVxZ
package main
import (
"fmt"
"sort"
"strconv"
)
func send(list []int, c chan []int) {
sort.Ints(list)
c <- list
}
// Split integers.
func split(list []int) (tmpS []int, splS []int) {
tmpS = list[len(list)/2:]
splS = list[0 : len(list)/2]
return tmpS, splS
}
func convert(sStr []string) (sInt []int) {
for _, r := range sStr {
digit, _ := strconv.Atoi(r)
sInt = append(sInt, digit)
}
fmt.Println("Sorted sub array: ", sInt)
return sInt
}
func main() {
list := []string{"-9", "-11", "12", "13", "9"}
fmt.Println("Your unsorted digits: ", list)
// Convert the whole slice
sInt := convert(list)
splS1, splS2 := split(sInt)
splS11, splS12 := split(splS1)
splS21, splS22 := split(splS2)
// Send in different go routines.
c := make(chan []int)
go send(splS11, c)
go send(splS12, c)
go send(splS21, c)
go send(splS22, c)
// Receive from a channel.
sortedS1 := <-c
sortedS2 := <-c
sortedS3 := <-c
sortedS4 := <-c
// Merge the 4 sorted slices.
sortedList1 := append(sortedS1, sortedS2...)
sortedList2 := append(sortedS3, sortedS4...)
finalList := append(sortedList1, sortedList2...)
// Sort it again
sort.Ints(finalList)
fmt.Println("Here your digits sorted: ", finalList)
}