lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
package sort_test
 
import (
   "fmt"
   "sort"
)
 
type Person struct {
   Name string
   Age  int
}
 
func (p Person) String() string {
   return fmt.Sprintf("%s: %d", p.Name, p.Age)
}
 
// ByAge implements sort.Interface for []Person based on
// the Age field.
type ByAge []Person
 
func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
 
func Example() {
   people := []Person{
       {"Bob", 31},
       {"John", 42},
       {"Michael", 17},
       {"Jenny", 26},
   }
 
   fmt.Println(people)
   // There are two ways to sort a slice. First, one can define
   // a set of methods for the slice type, as with ByAge, and
   // call sort.Sort. In this first example we use that technique.
   sort.Sort(ByAge(people))
   fmt.Println(people)
 
   // The other way is to use sort.Slice with a custom Less
   // function, which can be provided as a closure. In this
   // case no methods are needed. (And if they exist, they
   // are ignored.) Here we re-sort in reverse order: compare
   // the closure with ByAge.Less.
   sort.Slice(people, func(i, j int) bool {
       return people[i].Age > people[j].Age
   })
   fmt.Println(people)
 
   // Output:
   // [Bob: 31 John: 42 Michael: 17 Jenny: 26]
   // [Michael: 17 Jenny: 26 Bob: 31 John: 42]
   // [John: 42 Bob: 31 Jenny: 26 Michael: 17]
}