개요
sort.Slice를 사용했을때와 sort.SliceStable를 사용했을때의 결과를 비교
1. sort.Slice
package main
import (
	"fmt"
	"sort"
)
type Person struct {
	Name string
	Age  int
}
func main() {
	people := []Person{
		{"Alice", 30},
		{"Bob", 30},
		{"Charlie", 30},
		{"David", 30},
		{"Eve", 30},
		{"Alice", 10},
		{"Bob", 10},
		{"Charlie", 10},
		{"David", 10},
		{"Eve", 10},
		{"Alice", 20},
		{"Bob", 20},
		{"Charlie", 20},
		{"David", 20},
		{"Eve", 20},
	}
	// 이름으로 정렬
	sort.Slice(people, func(i, j int) bool {
		return people[i].Name < people[j].Name
	})
	fmt.Println("이름으로 정렬 sort.Slice:")
	for _, p := range people {
		fmt.Printf("%s - Age: %d\n", p.Name, p.Age)
	}
	fmt.Printf("\n")
	// 나이로 정렬
	sort.SliceStable(people, func(i, j int) bool {
		return people[i].Age < people[j].Age
	})
	fmt.Println("나이로 정렬 sort.Slice:")
	for _, p := range people {
		fmt.Printf("%s - Age: %d\n", p.Name, p.Age)
	}
}결과값:
이름으로 정렬 sort.Slice:
Alice - Age: 20        
Alice - Age: 30        
Alice - Age: 10        
Bob - Age: 30
Bob - Age: 10
Bob - Age: 20
Charlie - Age: 30      
Charlie - Age: 20      
Charlie - Age: 10      
David - Age: 30        
David - Age: 10        
David - Age: 20        
Eve - Age: 10
Eve - Age: 30
Eve - Age: 20
나이로 정렬 sort.Slice:
David - Age: 10        
Alice - Age: 10        
Eve - Age: 10
Bob - Age: 10
Charlie - Age: 10
Eve - Age: 20
Bob - Age: 20
Alice - Age: 20
Charlie - Age: 20
David - Age: 20
Charlie - Age: 30
David - Age: 30
Bob - Age: 30
Eve - Age: 30
Alice - Age: 30퀵소트를 베이스로 하는 정렬로 슬라이스의 원래의 순서가 보장 되지않는다
2. sort.SliceStable
package main
import (
	"fmt"
	"sort"
)
type Person struct {
	Name string
	Age  int
}
func main() {
	people := []Person{
		{"Alice", 30},
		{"Bob", 30},
		{"Charlie", 30},
		{"David", 30},
		{"Eve", 30},
		{"Alice", 10},
		{"Bob", 10},
		{"Charlie", 10},
		{"David", 10},
		{"Eve", 10},
		{"Alice", 20},
		{"Bob", 20},
		{"Charlie", 20},
		{"David", 20},
		{"Eve", 20},
	}
	// 이름으로 정렬
	sort.SliceStable(people, func(i, j int) bool {
		return people[i].Name < people[j].Name
	})
	fmt.Println("이름으로 정렬 sort.SliceStable:")
	for _, p := range people {
		fmt.Printf("%s - Age: %d\n", p.Name, p.Age)
	}
	fmt.Printf("\n")
	// 나이로 정렬
	sort.SliceStable(people, func(i, j int) bool {
		return people[i].Age < people[j].Age
	})
	fmt.Println("나이로 정렬 sort.SliceStable:")
	for _, p := range people {
		fmt.Printf("%s - Age: %d\n", p.Name, p.Age)
	}
}결과값:
이름으로 정렬 sort.SliceStable:
Alice - Age: 30              
Alice - Age: 10              
Alice - Age: 20              
Bob - Age: 30                
Bob - Age: 10                
Bob - Age: 20                
Charlie - Age: 30            
Charlie - Age: 10            
Charlie - Age: 20            
David - Age: 30              
David - Age: 10              
David - Age: 20              
Eve - Age: 30                
Eve - Age: 10                
Eve - Age: 20                
                             
나이로 정렬 sort.SliceStable:
Alice - Age: 10              
Bob - Age: 10                
Charlie - Age: 10            
David - Age: 10              
Eve - Age: 10                
Alice - Age: 20              
Bob - Age: 20                
Charlie - Age: 20
David - Age: 20
Eve - Age: 20
Alice - Age: 30
Bob - Age: 30
Charlie - Age: 30
David - Age: 30
Eve - Age: 30원래의 순서가 보장되는것을 알수있다
참고:
sort package - sort - Go Packages
ExampleMultiKeys demonstrates a technique for sorting a struct type using different sets of multiple fields in the comparison. We chain together "Less" functions, each of which compares a single field. package main import ( "fmt" "sort" ) // A Change is a
pkg.go.dev
https://cs.opensource.google/go/go/+/refs/tags/go1.20.6:src/sort/slice.go
https://cs.opensource.google/go/go/+/refs/tags/go1.20.6:src/sort/slice.go
cs.opensource.google
https://go.dev/src/sort/zsortfunc.go
- The Go Programming Language
go.dev
'[Go]' 카테고리의 다른 글
| [Go] 고랭에서의 예외처리 (exception handling in golang) (0) | 2024.06.22 | 
|---|---|
| [Go] import cycle not allowed - 해결 방안1: interface를 활용한 해결 방안 (1) | 2024.06.18 | 
| [Go] import cycle not allowed - 예제 (0) | 2024.06.18 | 
| [Go] 슬라이스의 얕은 복사와 깊은 복사 (Shallow Copy and Deep Copy of Slices) (0) | 2023.08.03 | 
| [Go] 고랭으로 간단한 HTTP Server 작성 (Writing a simple HTTP Server with Golang) (0) | 2023.07.23 |