一:数据类型篇
%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)
}
详细查看:我的笔记链接