[TOC]
0x01 变量类型章节
示例1.编写代码统计出字符串"为 Hello 中国 World,Go 语言 学习"
中汉字的数量。
[TOC]
示例1.编写代码统计出字符串"为 Hello 中国 World,Go 语言 学习"
中汉字的数量。
1 | // 方式1.统计字符串中中文个数 |
执行结果:1
字符串:为 Hello 中国 World,Go 语言 学习 (Length = 25),一共有 7 个中文字符
示例1.有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?
1 | // 查看出现一次的数字 |
执行结果:1
只出现一次的数字 : 8
示例2.用Go语言编写一个九九乘法表1
2
3
4
5
6
7
8
9// 九九乘法表
func MultiTable() {
for i := 1; i <= 9; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d * %d = %d, ", i, j, i*j)
}
fmt.Println()
}
}
示例1:求数组[1, 3, 5, 7, 8]
所有元素的和1
2
3
4
5
6
7
8
9func homework1() {
// 求数组`[1, 3, 5, 7, 8]`所有元素的和
arr := [...]int{1, 3, 5, 7, 8}
sum := 0
for _, v := range arr {
sum += v
}
fmt.Printf("%v 元素集合之和 : %d", arr, sum)
}
执行结果:1
[1 3 5 7 8] 元素集合之和 : 24
示例2.找出数组中和为指定值的两个元素的下标,比如从数组[1, 3, 5, 7, 8]
中找出和为8的两个元素的下标分别为(0,3)
和(1,2)
。1
2
3
4
5
6
7
8
9
10
11func homework2() {
// 比如从数组`[1, 3, 5, 7, 8]`中找出和为8的两个元素的下标分别为`(0,3)`和`(1,2)`。**
arr := [...]int{1, 3, 5, 7, 8}
for i, v := range arr {
for j := i + 1; j < len(arr); j++ {
if v+arr[j] == 8 {
fmt.Printf("arr[%d] + arr[%d] = %d \n", i, j, 8)
}
}
}
}
执行结果:1
2arr[0] + arr[3] = 8
arr[1] + arr[2] = 8
示例3.请使用内置的sort包对数组var a = [...]int{3, 7, 8, 9, 1}
进行排序(附加题,自行查资料解答)。1
2
3
4
5
6
7
8
9
10
11
12# 把数组变成切片
func textsort() {
a := [...]int{3, 7, 8, 9, 1}
fmt.Printf("a : %T , %v , ptr : %p \n", a, a, &a) // 数组
sort.Ints(a[:]) // 排序
fmt.Printf("a[:] : %T , %v , ptr : %p \n", a[:], a[:], a[:]) // 切片
fmt.Println("After sorted: ", a)
}
a : [5]int , [3 7 8 9 1] , ptr : 0xc0000c6000
a[:] : []int , [1 3 7 8 9] , ptr : 0xc0000c6000
After sorted: [1 3 7 8 9]
示例1.请写出下面代码的输出结果1
2
3
4
5
6
7func text() {
var a = make([]string, 5, 10)
for i := 0; i < 10; i++ {
a = append(a, fmt.Sprintf("%v", i)) // 扩容 + 10 ,容量 + 10
}
fmt.Println(len(a), cap(a), a)
}
实际执行结果:1
15 20 [0 1 2 3 4 5 6 7 8 9]
示例1.观察下面代码,写出最终的打印结果。1
2
3
4
5
6
7
8
9
10
11func main() {
type Map map[string][]int
m := make(Map)
s := []int{1, 2}
s = append(s, 3)
fmt.Printf("%+v\n", s) // [ 1,2,3 ]
m["s"] = s
s = append(s[:1], s[2:]...) // 关键点
fmt.Printf("%+v\n", s) // [ 1,3 ]
fmt.Printf("%+v\n", m["s"]) // [ 1,3,3 ]
}
示例2.写一个程序,统计一个字符串中每个单词出现的次数。比如:”how do you do”中how=1 do=2 you=1。
1 | func homework2() { |
执行结果:1
统计 how do you do 字符串每个单词出现的结果: map[do:2 how:1 you:1]
示例3.判断中文字符串的回文如,一行白鹭与鹭白行一
1 | func homework1() { |
执行结果:1
2[]int32, Len : 11 , Cap : 12
`a一行白鹭与鹭白行一a`是回文字符串
示例1.分金币1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75/*
你有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’ 函数
*/
var (
coins = 50
users = []string{
"Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
}
distribution = make(map[string]int, len(users))
)
func dispatchCoin() int {
// 1.遍历用户
for _, name := range users {
// 2.判断用户时候是否在 map 中
_, ok := distribution[name]
if ok {
continue
}
// 3.利用匿名函数求出每个人的获得金币数
temp := func() int {
count := 0
for _, crune := range name {
// 方式1
// c := string(crune)
// if c == "e" || c == "E" {
// count += 1
// } else if c == "i" || c == "I" {
// count += 2
// } else if c == "o" || c == "O" {
// count += 3
// } else if c == "u" || c == "U" {
// count += 4
// }
// 方式2(推荐)
switch crune {
case 'e', 'E':
count += 1
coins -= 1
case 'i', 'I':
count += 2
coins -= 2
case 'o', 'O':
count += 3
coins -= 3
case 'u', 'U':
count += 4
coins -= 4
}
}
return count
}()
// 4.将人员和金币数进行绑定
distribution[name] = temp
}
// 5.输出所有人员占有的金币数
fmt.Println(distribution)
// 6.返回剩余金币数量
return coins
}
func homework() {
left := dispatchCoin()
fmt.Println("剩下的金币数:", left)
}
执行结果:1
2map[Aaron:3 Adriano:5 Augustus:12 Elizabeth:4 Emilie:6 Giana:2 Heidi:5 Matthew:1 Peter:2 Sarah:0]
剩下的金币数: 10
示例2.有n个台阶,一次可以走一步或者两步,问一共有多少种走法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17func ladder(step uint64) (ret uint64) {
// 如果只有一步阶梯则只有一种走法。
if step == 1 {
return 1
}
// 如果有两步阶梯则有两种走法。
if step == 2 {
return 2
}
// 如有三步则有3种走法,所以 n 步 = (n - 1) + (n -2)
return ladder(step-1) + ladder(step-2)
}
func demo2() {
ret := ladder(6)
fmt.Println("当有六步阶梯时,有", ret, "种走法!")
}
执行结果:1
当有六步阶梯时,有 13 种走法!
示例1.请问下面代码的执行结果是什么?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22type student struct {
name string
age int
}
func homework1() {
m := make(map[string]*student)
// 后进先出
stus := []student{
{name: "小王", age: 18},
{name: "娜扎", age: 23},
{name: "大王", age: 900}, // 初始指针指向的位置
}
fmt.Printf("stus : %p \n", &stus)
for _, stu := range stus {
m[stu.name] = &stu
fmt.Printf("for stu :%p, value : %v, Size: %d\n", &stu, stu, unsafe.Sizeof(stu.age))
}
for k, v := range m {
fmt.Println(k, "=>", v.name)
}
}
执行结果:1
2
3
4
5
6
7stus : 0xc00000c030
for stu :0xc00000c048, value : {小王 18}, Size: 8
for stu :0xc00000c048, value : {娜扎 23}, Size: 8
for stu :0xc00000c048, value : {大王 900}, Size: 8
小王 => 大王
娜扎 => 大王
大王 => 大王
示例2.利用函数Funtion实现考生信息系统1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108package main
import (
"fmt"
"os"
)
/** Desc: 采用函数实现考生信息的增加与删除**/
var (
// options
flag uint8
// key : value
allStudent map[int64]*Student
)
// 结构体
type Student struct {
id int64
name string
age uint8
}
// 构造函数
func newStudent(id int64, name string, age uint8) *Student {
return &Student{
id: id,
name: name,
age: age,
}
}
// 验证考生是否存在
func judgeStudent(id int64) bool {
_, ok := allStudent[id]
if ok {
return true
} else {
return false
}
}
// 添加考生
func addStudent() {
var (
id int64
name string
age uint8
)
fmt.Println("#请输入考生 id name age 信息以空格分割:")
fmt.Scan(&id, &name, &age)
if !judgeStudent(id) {
student := newStudent(id, name, age)
allStudent[id] = student
} else {
fmt.Println("该id号的考生已存在无需重复添加.")
}
}
// 删除考生
func delStuednt(id int64) {
if judgeStudent(id) {
delete(allStudent, id)
fmt.Printf("已删除考生号为 %d 的学生信息.\n", id)
} else {
fmt.Println("该id号的考生不存在.")
}
}
// 显示考生
func showStudent() {
for k, v := range allStudent {
fmt.Printf("uid: %d 姓名: %s 年龄: %d\n", k, v.name, v.age)
}
}
func main() {
// Step 0.初始化存放考生信息的Map
allStudent = make(map[int64]*Student)
fmt.Printf("allStudent len %v", len(allStudent))
// Step 1
fmt.Println("欢迎使用学生信息系统简单版本")
fmt.Printf("功能说明: \n1.增加学生\n2.查看学生\n3.删除学生\n4.退出程序\n\n")
// Step 2
for {
fmt.Printf("功能选择: ")
fmt.Scanln(&flag)
fmt.Printf("#你选择第 %d 个的选项\n", flag)
// step 3
switch flag {
case 1:
addStudent()
case 2:
showStudent()
case 3:
fmt.Printf("请输入要删除的学生 uid:")
var uid int64
fmt.Scanln(&uid)
delStuednt(uid)
case 4:
fmt.Printf("程序结束 :")
os.Exit(1)
default:
fmt.Printf("功能说明: \n1.增加学生\n2.查看学生\n3.删除学生\n4.退出程序")
}
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32欢迎使用学生信息系统简单版本
功能说明:
1.增加学生
2.查看学生
3.删除学生
4.退出程序
功能选择: 1
# 你选择第 1 个的选项
# 请输入考生 id name age 信息以空格分割:
10086 移动 25
功能选择: 1
# 你选择第 1 个的选项
# 请输入考生 id name age 信息以空格分割:
10010 联通 25
功能选择: 1
# 你选择第 1 个的选项
# 请输入考生 id name age 信息以空格分割:
10000 典电信 26
功能选择: 2
# 你选择第 2 个的选项
uid: 10086 姓名: 移动 年龄: 25
uid: 10010 姓名: 联通 年龄: 25
uid: 10000 姓名: 电信 年龄: 26
功能选择: 3
# 你选择第 3 个的选项
请输入要删除的学生 uid:10000
已删除考生号为 10000 的学生信息.
功能选择: 2
# 你选择第 2 个的选项
uid: 10086 姓名: 移动 年龄: 25
uid: 10010 姓名: 联通 年龄: 25
示例3.利用结构体方法进行实现考生信息管理系统1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107package main
import (
"fmt"
"os"
)
/** Desc: 采用结构体方法实现考生信息的增加与删除**/
var (
// options
flag uint8
// key : value
allStudent map[int64]*Student
)
// 结构体
type Student struct {
id int64
name string
age uint8
}
// 构造函数
func newStudent(id int64, name string, age uint8) *Student {
return &Student{
id: id,
name: name,
age: age,
}
}
// 验证考生是否存在
func (s *Student) judge(id int64) bool {
_, ok := allStudent[id]
if ok {
return true
} else {
return false
}
}
// 添加考生
func (s *Student) add() {
var (
id int64
name string
age uint8
)
fmt.Println("#请输入考生 id name age 信息以空格分割:")
fmt.Scan(&id, &name, &age)
if !s.judge(id) {
student := newStudent(id, name, age)
allStudent[id] = student
} else {
fmt.Println("该id号的考生已存在无需重复添加.")
}
}
// 删除考生
func (s *Student) del(id int64) {
if s.judge(id) {
delete(allStudent, id)
fmt.Printf("已删除考生号为 %d 的学生信息.\n", id)
} else {
fmt.Println("该id号的考生不存在.")
}
}
// 显示考生
func (s *Student) show() {
for k, v := range allStudent {
fmt.Printf("uid: %d 姓名: %s 年龄: %d\n", k, v.name, v.age)
}
}
func main() {
// Step 0.初始化存放考生信息的Map
allStudent = make(map[int64]*Student, 48)
student := Student{}
// Step 1
fmt.Println("欢迎使用学生信息系统简单版本")
fmt.Printf("功能说明: \n1.增加学生\n2.查看学生\n3.删除学生\n4.退出程序\n\n")
// Step 2
for {
fmt.Printf("功能选择: ")
fmt.Scanln(&flag)
fmt.Printf("#你选择第 %d 个的选项\n", flag)
// step 3
switch flag {
case 1:
student.add() // 结构体中调用add方法
case 2:
student.show() // 结构体中调用show方法
case 3:
fmt.Printf("请输入要删除的学生 uid:")
var uid int64
fmt.Scanln(&uid)
student.del(uid) // 结构体中调用del方法
case 4:
fmt.Printf("程序结束 :")
os.Exit(1)
default:
fmt.Printf("功能说明: \n1.增加学生\n2.查看学生\n3.删除学生\n4.退出程序")
}
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22功能选择: 1
#你选择第 1 个的选项
#请输入考生 id name age 信息以空格分割:
10086 移动 25
功能选择: 1
#你选择第 1 个的选项
#请输入考生 id name age 信息以空格分割:
10010 联通 24
功能选择: 2
#你选择第 2 个的选项
uid: 10086 姓名: 移动 年龄: 25
uid: 10010 姓名: 联通 年龄: 24
功能选择: 3
#你选择第 3 个的选项
请输入要删除的学生 uid:10010
已删除考生号为 10010 的学生信息.
功能选择: 2
#你选择第 2 个的选项
uid: 10086 姓名: 移动 年龄: 25
功能选择: 4
#你选择第 4 个的选项
程序结束 :exit status 1
作业4.反转一个单链表
示例说明: 1->2->3->4->5->NULL
, 5->4->3->2->1->NULL
代码示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62package main
import "fmt"
// 链表结构体
type ListNode struct {
val int
Next *ListNode
}
// 反转链表函数
func reverseList(head *ListNode) *ListNode {
var pre *ListNode
cur := head
for cur != nil {
tmp := cur.Next // 把下一个节点存放到临时变量中
cur.Next = pre // 首节点赋予下一指向节点(首次Nil)
pre = cur // 将当前节点(首次val为1的地址)赋予pre
cur = tmp // 将上面临时变量地址(首次val为2的地址)赋予cur
}
return pre // 返回反转链表
}
func main() {
// 1.实例化链表
head := &ListNode{
val: 1,
Next: &ListNode{
val: 2,
Next: &ListNode{
val: 3,
Next: &ListNode{
val: 4,
Next: &ListNode{
val: 5,
Next: nil,
},
},
},
},
}
// 链表实例化对象副本拷贝
header := head
fmt.Println("反转前首地址:", header)
for header != nil {
fmt.Printf("%v->", header.val)
header = header.Next
if header == nil {
fmt.Printf("Nil\n")
}
}
// 2.调用反转链表
res := reverseList(head)
fmt.Println("反转后首地址:", res)
for res != nil {
fmt.Printf("%v->", res.val)
res = res.Next
if res == nil {
fmt.Printf("Nil\n")
}
}
}
执行结果:
1 | 反转前首地址: &{1 0xc000046240} |
作业1.利用接口既可以求三角形的面积也能求正方形的面积1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30package main
import (
"fmt"
"math"
)
type GarphicArea interface {
Square(float64) float64 // 正方形
Triangle(float64, float64, float64) float64 //三角形
}
type GarphicName struct{ Name string }
func (g *GarphicName) Square(a float64) float64 {
// S = a^2
return math.Pow(a, 2)
}
func (g *GarphicName) Triangle(a, b, c float64) float64 {
//(海伦公式)(p=(a+b+c)/2) S=sqrt[p(p-a)(p-b)(p-c)]
p := (a + b + c) / 2
return math.Sqrt(p * (p - a) * (p - b) * (p - c))
}
func main() {
var ga GarphicArea = &GarphicName{"正方形"}
fmt.Println("正方形面积: ", ga.Square(4))
ga = &GarphicName{"三角形"}
fmt.Println("三角形面积: ", ga.Triangle(3, 4, 5))
}
执行结果:1
2正方形面积: 16
三角形面积: 6
作业1.利用包来封装调用位移运算符进行左移或者右移多少位,并输出其二进制表示的结果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// # weiyigeek.top/custom/pkg/bitmove.go
// # packeageName bitmove
package bitmove
import "fmt"
func Leftmove(n int, shift int) {
fmt.Printf("%v << %v = %08b\n", n, shift, n<<shift)
}
func RightMove(n int, shift int) {
fmt.Printf("%v >> %v = %08b\n", n, shift, n>>shift)
}
// # 主入口文件我们可使用import来导入我们自己编写的包(注意包中属性、函数、结构体、接口需要首字母大小才能被外部引用)
// # weiyigeek.top/studygo/homework/2.packeage/displacement.go
package main
import (
"fmt"
bitmove "weiyigeek.top/custom/pkg"
)
func main() {
bitmove.Leftmove(4, 2)
bitmove.RightMove(10, 2)
}
执行结果:1
24 << 2 = 00010000
10 >> 2 = 00000010
作业1.获取当前时间,格式化输出为2006/01/02 15:04:05`格式。
fmt.Println(“当前时间: “, time.Now().Format(“2006/01/02 15:04:05”))
当前时间: 2021/09/27 15:02:31
作业2.编写程序统计一段代码的执行耗时时间,单位精确到微秒。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20func demo2() {
// 开始时间
startTime := time.Now()
// 从1+...+1000之和
sum := 0
for i := 0; i <= 1000; i++ {
sum += i
}
fmt.Println("从1+...+1000之和为", sum)
// 结束时间
endTime := time.Now()
fmt.Println("该段代码耗时时间为:", endTime.Sub(startTime))
}
// ==== 执行结果 ====
从1+...+1000之和为 500500
该段代码耗时时间为: 6.765µs
日志库
程序需求分析:
stdout
。Debug/Trace/Info/Warning/Error/Falat
logger日志等级列表1
2
3
4
5
6
7
8
9等级 配置 释义 控制台颜色
0 EMER 系统级紧急,比如磁盘出错,内存异常,网络不可用等 红色底
1 ALRT 系统级警告,比如数据库访问异常,配置文件出错等 紫色
2 CRIT 系统级危险,比如权限出错,访问异常等 蓝色
3 EROR 用户级错误 红色
4 WARN 用户级警告 黄色
5 INFO 用户级重要 天蓝色
6 DEBG 用户级调试 绿色
7 TRAC 用户级基本输出,比如成员信息,结构体值等 绿色
项目代码演示:
1 | package mlogger |
1 | package mlogger |
1 | /**自定义日志库调用演示入口**/ |
运行结果:
温馨提示: Go 语言中比较好用的第三方日志工具还有 go-logging, logrus, zap 模块包
你好看友,欢迎关注博主微信公众号哟! ❤
这将是我持续更新文章的动力源泉,谢谢支持!(๑′ᴗ‵๑)
温馨提示: 未解锁的用户不能粘贴复制文章内容哟!
方式1.请访问本博主的B站【WeiyiGeek】首页关注UP主,
将自动随机获取解锁验证码。
Method 2.Please visit 【My Twitter】. There is an article verification code in the homepage.
方式3.扫一扫下方二维码,关注本站官方公众号
回复:验证码
将获取解锁(有效期7天)本站所有技术文章哟!
@WeiyiGeek - 为了能到远方,脚下的每一步都不能少
欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】
或者个人公众号【WeiyiGeek】
联系我。
更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】, 个人首页地址( https://weiyigeek.top )
专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注、转个发、赞个助】,这将对我的肯定,我将持续整理发布更多优质原创文章!。
最后更新时间:
文章原始路径:_posts/编程世界/Go/Example/1.Go语言编程学习课后实践.md
转载注明出处,原文地址:https://blog.weiyigeek.top/2020/4-25-603.html
本站文章内容遵循 知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议