| // 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) | 
 | 	} | 
 | } |