一:数据类型篇
%d 十进制 %T 输出数据类型 %b将整数转化为整数型
%o 八进制 %x十六进制 %v使用默认格式输出值
1.编写代码统计出字符串 "hello沙河小王子"中汉字的数量。
package main import "fmt" func main() { target := "hello沙河小王子" count := 0 for _, value := range target { if len(string(value)) >= 3 { count++ } } fmt.Println(count) }
注解:在go中,中文字符不能直接通过len函数来统计字符串字符长度,以为是以UTF-8格式进行存储,字符串上调用len函数,取得的是字符串包含字节个数,中文字符算三个字节,所以通过判断字符的长度来进行判断
二:运算符篇
2.有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?
package main import "fmt" func main() { var b = [...]int{1, 1, 2, 2, 4, 5, 5, 6, 6} //var c = [3]int{1, 1, 2} //var d = [3]int{1: 2, 2: 3, 0: 4} count := 0 for _, value := range b { count ^= value } fmt.Println(count) }
注解:^二进制两个不同才为1
三:数组和流程控制篇
3.编写代码打印9*9乘法表
package main import "fmt" func main() { for i := 1; i < 10; i++ { for j := 1; j <= i; j++ { fmt.Printf("%v*%v\t", j, i) } fmt.Println() } }
4.对输出结果进行分析
package main import "fmt" func main() { var a = make([]string, 5, 10) for i := 0; i < 10; i++ { a = append(a, fmt.Sprintf("%v", i)) } fmt.Println(a) //[ 0 1 2 3 4 5 6 7 8 9] }
注解:因为切片初始长度为5且为空,使用append添加元素后,容量不够可以扩容,所以输出后前面会存在一些空格
四:Map篇
5.写一个程序,统计一个字符串中每个单词出现的次数。比如:”how do you do”中how=1 do=2 you=1。
package main import ( "fmt" "strings" ) func main() { test := "how do you do" result := count(test) for index, value := range result { fmt.Printf("the world:%v \t appeared:%v \n", value, index) } } func count(test string) map[string]int { test1 := strings.Split(test, " ") mapDemo := make(map[string]int, 10) for _, v := range test1 { mapDemo[v]++ } return mapDemo } //the world:1 appeared:how //the world:1 appeared:you //the world:2 appeared:do
注解:根据map主键的增加,找出每个单词频率
6.对结果进行分析(大坑)
func main() { type Map map[string][]int m := make(Map) s := []int{1, 2} s = append(s, 3) fmt.Printf("%+v\n", s) m["q1mi"] = s s = append(s[:1], s[2:]...) fmt.Printf("%+v\n", s) fmt.Printf("%+v\n", m["q1mi"]) } //[1 2 3] [1 3] [1 3 3]
注解:根据切片定义,切片本质是一个底层数组包括指针,容量,长度,s和m[“qimi”],它们是共享一个底层数组的,但是长度和容量是各顾各的,后面s修改了长度和索引为1的值,m[“qimi”]长度不受限制,但是值改变了
7.分金币
package main import ( "fmt" ) /* 你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。 分配规则如下: a. 名字中每包含1个'e'或'E'分1枚金币 b. 名字中每包含1个'i'或'I'分2枚金币 c. 名字中每包含1个'o'或'O'分3枚金币 d: 名字中每包含1个'u'或'U'分4枚金币 写一个程序,计算每个用户分到多少金币,以及最后剩余多少金币? 程序结构如下,请实现 ‘dispatchCoin’ 函数 */ func dispatchCoin() (left int) { var ( coins = 50 user = []string{ "Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth", } distribution = make(map[string]int, len(user)) ) for _, name := range user { getCoin := 0 for _, n := range name { switch n { case 'e', 'E': getCoin += 1 case 'i', 'I': getCoin += 2 case 'o', 'O': getCoin += 3 case 'u', 'U': getCoin += 4 } } distribution[name] = getCoin coins -= getCoin } fmt.Printf("%v\n", distribution) return coins } func main() { left := dispatchCoin() fmt.Println("剩下:", left) }
注解:题中所给依旧是一个map,通过两层for循环,将字符分别统计,最后输出
五:结构体篇
8.使用“面向对象”的思维方式编写一个学生信息管理系统。
学生有id、姓名、年龄、分数等信息
程序提供展示学生列表、添加学生、编辑学生信息、删除学生等功能
package main import ( "fmt" "os" ) type student struct { id int name string } //创造一个map来接收学生信息 var studentList = make(map[int]*student) //新添加学生的信息 func newstudent(id int, name string) *student { return &student{ id, name, } } //修改 func (e *student) editStudent(name string) { e.name = name } // 列出学生信息列表 func listStudent() { if len(studentList) == 0 { fmt.Println("学生列表为空") } else { for i, v := range studentList { fmt.Printf("学号:%d 姓名:%s\n", i, v.name) } } } // 增加学生信息 func addStudent() { var key int var name string fmt.Printf("请输入学生学号:") //这个函数将会返回个数 fmt.Scanln(&key) _, ok := studentList[key] have := ok for have { fmt.Println("学号已经存在") fmt.Printf("请输入学生学号:") fmt.Scanln(&key) _, ok := studentList[key] have = ok } fmt.Printf("请输入学生姓名:") fmt.Scanln(&name) newstudent := newstudent(key, name) studentList[key] = newstudent } func editStudent() { var key int fmt.Printf("请输入需要修改信息学生的学号:") fmt.Scanln(&key) _, ok := studentList[key] if ok { var name string fmt.Printf("请输入需要修改学生学号:") fmt.Scanln(&name) studentList[key].editStudent(name) fmt.Printf("修改成功\n") listStudent() } else { fmt.Println("学号不存在") } } func deleteStudent() { var key int fmt.Printf("请输入需要删除学生的学号:") fmt.Scanln(&key) _, ok := studentList[key] if ok { delete(studentList, key) listStudent() fmt.Println("删除成功") } else { fmt.Println("学号不存在") } } func main() { fmt.Println("欢迎进入学生管理系统") //无限循环 for { fmt.Println(` 1.展示学生列表 2.添加学生 3.编辑学生信息 4.删除学生 5.退出 `) fmt.Printf("请选择你的操作:") var input int //函数扫描标准输入中给定的输入文本 //它返回成功扫描的项目数 fmt.Scanln(&input) //fmt.Printf("你选择的操作是:%d\n、", input) switch input { case 1: listStudent() case 2: addStudent() case 3: editStudent() case 4: deleteStudent() case 5: os.Exit(1) default: fmt.Println("请按照规则输入") } } }
六:基础包篇
补充:同一个项目下只能有一个mod文件,不同的mod是在不同的项目下,同一个mod下的文件可以相互引用
9.编写一个calc包实现加减乘除四个功能函数,在snow这个包中引入calc包并调用其加减乘除四个函数实现数学运算。
package main import ( "fmt" "os" "strconv" "weishuaibo.com/xxx/test/calc" ) func main() { for { var a, b, c string var result float64 fmt.Printf("请输入表达式:") fmt.Scanln(&a, &b, &c) //ParseFloat是一个内置的函数, //可以将一个字符串值转换为一个浮点数 aa, _ := strconv.ParseFloat(a, 64) cc, _ := strconv.ParseFloat(c, 64) if b == "+" { result = calc.Sum(aa, cc) } else if b == "-" { result = calc.Sub(aa, cc) } else if b == "*" { result = calc.Mul(aa, cc) } else if b == "/" { result = calc.Div(aa, cc) } else { os.Exit(0) } fmt.Printf("%v \n", result) } }
运算符包:
package calc func Sum(a float64, b float64) float64 { return (a + b) } func Sub(a float64, b float64) float64 { return (a - b) } func Mul(a float64, b float64) float64 { return (a * b) } func Div(a float64, b float64) float64 { return (a / b) }