符合类型容器综合案例
/*
封装一个对整形切片 进行排序的函数
随机招收一些学生进班
随机生成学生的成绩
对学生成绩排名并输出
封装一个对全班学生成绩进行排名的函数
将上述封装好的俩个函数丢入mylib包中
在当前工程中调用mylib包内的函数
在其他工程中调用mylib包内的函数
*/
案例
1 package main
2
3 import (
4 "fmt"
5 "math/rand"
6 "time"
7 )
8
9 //全局变量
10
11 var names []string
12
13 //--包初始化函数,执行在main函数之前.
14 func init() {
15 fmt.Println("***包初始化***")
16 names = make([]string, 0)
17 }
18
19 func main() {
20 //招生
21 AddStudent("小王", "小红", "小张", "小许", "小明", "小曼")
22 fmt.Println(names)
23
24 //把学生随机分配成绩 也就是考试
25 scoreMap := TakeExam(names...)
26 fmt.Println(scoreMap)
27
28 //显示排名
29 ShowRanking(scoreMap)
30
31 }
32
33 //对成绩做降序排名 进行排序
34 func ShowRanking(scoreMap map[string]int) {
35
36 //形成名单,锁死姓名的循序,才能开始排序.
37 names := make([]string, 0)
38 for name, _ := range scoreMap {
39 names = append(names, name)
40 }
41
42 /*对names 按分数的降序进行排列*/
43 for i := 0; i < len(scoreMap)-1; i++ {
44 //锁定第i位,将i后面的每个人(i),的分数与第i个人比较.
45 // 将剩余的同志中,最高分数的人,调整到当前位置.
46 for j := i + 1; j < len(names); j++ {
47 //如果第四个人的分数比第三个人高,就互换位置.
48 if scoreMap[names[j]] > scoreMap[names[i]] {
49 names[i], names[j] = names[j], names[i]
50 }
51
52 }
53
54 }
55 /*按names的顺序输出姓名和排序*/
56 for i, name := range names {
57 fmt.Printf("第%d名:%-6s %3d
", i+1, name, scoreMap[name])
58 }
59 }
60
61
62 //给examres考试,为每个人生成随机成绩.
63 func TakeExam(examers ...string) (scoreMap map[string]int) {
64
65 //定义出scoreMap里面是空的
66 scoreMap = make(map[string]int)
67
68 for _, name := range examers {
69 score := GetRandomInt(100)
70 scoreMap[name] = score
71
72 }
73 return
74 }
75
76 //生成0-n之间的随机分数
77 func GetRandomInt(n int) int {
78 time.Sleep(time.Nanosecond) //睡1毫秒
79 r := rand.New(rand.NewSource(time.Now().UnixNano()))
80 return r.Intn(n + 1)
81 }
82
83 //添加学生的函数
84 func AddStudent(newcomers ...string) {
85 names = append(names, newcomers...)
86
87 }
88
89 /*
90 ***包初始化***
91 [小王 小红 小张 小许 小明 小曼]
92 map[小张:75 小许:93 小明:25 小曼:39 小王:51 小红:21]
93 第1名:小许 93
94 第2名:小张 75
95 第3名:小王 51
96 第4名:小曼 39
97 第5名:小明 25
98 第6名:小红 21
99 */