|  | // 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 Grams int | 
|  |  | 
|  | func (g Grams) String() string { return fmt.Sprintf("%dg", int(g)) } | 
|  |  | 
|  | type Organ struct { | 
|  | Name   string | 
|  | Weight Grams | 
|  | } | 
|  |  | 
|  | type Organs []*Organ | 
|  |  | 
|  | func (s Organs) Len() int      { return len(s) } | 
|  | func (s Organs) Swap(i, j int) { s[i], s[j] = s[j], s[i] } | 
|  |  | 
|  | // ByName implements sort.Interface by providing Less and using the Len and | 
|  | // Swap methods of the embedded Organs value. | 
|  | type ByName struct{ Organs } | 
|  |  | 
|  | func (s ByName) Less(i, j int) bool { return s.Organs[i].Name < s.Organs[j].Name } | 
|  |  | 
|  | // ByWeight implements sort.Interface by providing Less and using the Len and | 
|  | // Swap methods of the embedded Organs value. | 
|  | type ByWeight struct{ Organs } | 
|  |  | 
|  | func (s ByWeight) Less(i, j int) bool { return s.Organs[i].Weight < s.Organs[j].Weight } | 
|  |  | 
|  | func Example_sortWrapper() { | 
|  | s := []*Organ{ | 
|  | {"brain", 1340}, | 
|  | {"heart", 290}, | 
|  | {"liver", 1494}, | 
|  | {"pancreas", 131}, | 
|  | {"prostate", 62}, | 
|  | {"spleen", 162}, | 
|  | } | 
|  |  | 
|  | sort.Sort(ByWeight{s}) | 
|  | fmt.Println("Organs by weight:") | 
|  | printOrgans(s) | 
|  |  | 
|  | sort.Sort(ByName{s}) | 
|  | fmt.Println("Organs by name:") | 
|  | printOrgans(s) | 
|  |  | 
|  | // Output: | 
|  | // Organs by weight: | 
|  | // prostate (62g) | 
|  | // pancreas (131g) | 
|  | // spleen   (162g) | 
|  | // heart    (290g) | 
|  | // brain    (1340g) | 
|  | // liver    (1494g) | 
|  | // Organs by name: | 
|  | // brain    (1340g) | 
|  | // heart    (290g) | 
|  | // liver    (1494g) | 
|  | // pancreas (131g) | 
|  | // prostate (62g) | 
|  | // spleen   (162g) | 
|  | } | 
|  |  | 
|  | func printOrgans(s []*Organ) { | 
|  | for _, o := range s { | 
|  | fmt.Printf("%-8s (%v)\n", o.Name, o.Weight) | 
|  | } | 
|  | } |