
学习go语言基础完成的小项目
Go语言是由Google公司开发的一门编程语言,其主要目标是简化和加快软件开发过程,并使得开发出的程序具有高效率、高性能和可维护性,作为一门新兴的编程语言,Go语言在各个领域都有广泛的应用,尤其在Web服务器、网络编程、云计算等领域中表现出色,学习Go语言需要一定的编程基础,但相对于其他编程语言而言,它的语法结构更加简单,易于学习。此外,Go语言对并发编程提供了原生支持,使得开发者可以更轻松地编写
前言
Go语言是由Google公司开发的一门编程语言,其主要目标是简化和加快软件开发过程,并使得开发出的程序具有高效率、高性能和可维护性,作为一门新兴的编程语言,Go语言在各个领域都有广泛的应用,尤其在Web服务器、网络编程、云计算等领域中表现出色,学习Go语言需要一定的编程基础,但相对于其他编程语言而言,它的语法结构更加简单,易于学习。此外,Go语言对并发编程提供了原生支持,使得开发者可以更轻松地编写高并发程序。
所以我在大二就开始学习go语言,并用自己才学的基础知识做一些小项目,以便吸收所学的知识。
一、猜拳小游戏
package main
import (
"fmt"
"math/rand"
"strconv"
"time"
)
func main() {
fmt.Println("\t欢迎来到猜拳游戏!")
rand.Seed(time.Now().UnixNano()) //设置种子
var choice, myn string
var computerchoice string //电脑出拳
var mychoice string //我出拳
var mycount, computercount int //我和机器各自赢得次数
var count int //统计游戏总次数
FistMap := map[int]string{0: "石头", 1: "剪刀", 2: "布"}
fmt.Println("-------------------------------------")
fmt.Print("游戏规则:三局两胜\n")
fmt.Print("注意:1为继续玩 0为退出\n")
fmt.Println("-------------------------------------")
for {
fmt.Printf("是否继续玩(1.继续玩,0.退出游戏):")
fmt.Scan(&choice)
choiceint, err := strconv.Atoi(choice)
for err != nil || (choiceint < 0 || choiceint > 1) {
fmt.Printf("你的输入不合法!请输入(0-1)之间的数:")
fmt.Scan(&choice)
choiceint, err = strconv.Atoi(choice)
}
if choiceint == 1 {
for i := 0; i < 3; i++ {
n := rand.Intn(3) //取0-2的随机整数存在n变量里
fmt.Printf("请输入你的出招(0为石头,1为剪刀,2为布):")
fmt.Scan(&myn)
//如果用户不按要求输入,就重新让他输入
mynint, errint := strconv.Atoi(myn)
for errint != nil || (mynint > 2 || mynint < 0) {
fmt.Printf("你的出招有误,重新输入(0为石头,1为剪刀,2为布):")
fmt.Scan(&myn)
mynint, errint = strconv.Atoi(myn)
}
computerchoice = FistMap[n]
mychoice = FistMap[mynint]
if (computerchoice == "石头" && mychoice == "布") || (computerchoice == "剪刀" && mychoice == "石头") || (computerchoice == "布" && mychoice == "剪刀") {
fmt.Printf("机器出招(%s) -- 我出招(%s)\n", computerchoice, mychoice)
mycount += 1
} else if (computerchoice == "石头" && mychoice == "剪刀") || (computerchoice == "剪刀" && mychoice == "布") || (computerchoice == "布" && mychoice == "石头") {
fmt.Printf("机器出招(%s) --我出招(%s)\n", computerchoice, mychoice)
computercount += 1
} else {
fmt.Printf("机器出招(%s) --我出招(%s)\n", computerchoice, mychoice)
}
}
count += 1
if mycount > computercount {
fmt.Println("----最终还是我赢了呀,啊哈哈哈!----")
} else if mycount < computercount {
fmt.Println("----最终我还是输了,呜呜呜呜!----")
} else {
fmt.Println("----最终达成了个平手,下次再战----")
}
}
if choiceint == 0 {
fmt.Printf("拜拜了,本次你一共玩了%d次", count)
break
}
}
}
运行结果:
二、猜数字小游戏
package main
import (
"fmt"
"math/rand"
"strconv"
"time"
)
// 菜单栏
func menu() {
fmt.Println("-----------------------")
fmt.Println("\t猜字谜游戏")
fmt.Println("1.游戏规则")
fmt.Println("2.进入游戏")
fmt.Println("0.退出游戏")
fmt.Println("-----------------------")
}
// 游戏规则
func gamerules() {
fmt.Println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
fmt.Println("游戏是闯关的猜数字游戏,游戏从易到难\n每个关卡有5次机会,失败了就会退出游戏,成功了就进入下一个关卡\n注意:游戏一旦开启就不能退出,中途死亡或者完成游戏则程序自动退出\n游戏关卡由自己设置")
fmt.Println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$")
}
// 进入游戏
func gamestart(gamen int, level int) bool {
fmt.Printf("----第%d关游戏开始----\n", level)
rand.Seed(time.Now().UnixNano()) //设置随机数种子
n := rand.Intn(gamen) //设置一个变量以内整数
var UserN string //用户猜的数据保存在这个变量里
var count int = 0 //做一个计数器来统计用户能几次猜对
var result bool
// fmt.Printf("随机数为:%d\n", n)
for true {
count += 1
fmt.Printf("请输入%d以内的正整数:", gamen)
fmt.Scan(&UserN)
UserNint, err := strconv.Atoi(UserN)
for err != nil || UserNint < 0 {
fmt.Printf("你输入的不合法,请输入正整数:")
fmt.Scan(&UserN)
UserNint, err = strconv.Atoi(UserN)
}
if UserNint > n {
fmt.Printf("你猜的数太大了!请输入0-%d之间的数\n", UserNint)
} else if UserNint < n {
fmt.Printf("你猜的数太小了!请输入%d-%d之间的数\n", UserNint, gamen)
} else {
fmt.Println("恭喜你猜对了!")
break
}
if count > 5 {
return false
}
}
if count <= 5 {
result = true
} else {
result = false
}
return result
}
func main() {
var i int
var n string
for {
menu()
var choice string
fmt.Printf("请输入你的选择:")
fmt.Scan(&choice)
choiceint, err := strconv.Atoi(choice)
for err != nil || (choiceint > 2 || choiceint < 0) {
fmt.Printf("你的输入不合法请输入(0-2)之间的数:")
fmt.Scan(&choice)
choiceint, err = strconv.Atoi(choice)
}
switch choiceint {
case 1:
gamerules()
case 2:
fmt.Printf("请输入你要完成游戏的关卡数:")
fmt.Scan(&n)
nint, err := strconv.Atoi(n)
for err != nil || nint < 0 {
fmt.Printf("你的输入不合法,请输入正整数:")
fmt.Scan(&n)
nint, err = strconv.Atoi(n)
}
for {
i += 1
if gamestart(5*i, i) { //如果这个gamestart返回为true则继续游戏,返回为false则退出游戏,游戏失败
fmt.Println("@@游戏以通关,即将进入下一关@@")
} else {
fmt.Println("游戏挑战失败,over!")
return
}
if i == nint {
fmt.Println("**你真的很棒,游戏已经完成了耶**")
return
}
}
case 0:
fmt.Println("游戏退出,欢迎下次再玩")
return
}
}
}
运行结果:
三、学生管理系统
package main
import (
"bufio"
"encoding/json"
"fmt"
"strconv"
"io/ioutil"
"os"
"strings"
)
type Student struct {
Name string //姓名
Sex string //性别
Age int //年龄
Grade string //年级
Major string //专业
Address string //地址
}
// 菜单栏
func menu() {
fmt.Println("-----------------------------")
fmt.Println("\t学生管理信息系统程序")
fmt.Println(" 1.查询学生信息")
fmt.Println(" 2.增加学生信息")
fmt.Println(" 3.修改学生信息")
fmt.Println(" 4.删除学生信息")
fmt.Println(" 0.退出该程序")
fmt.Println("-----------------------------")
}
// 创建一个学生类,添加学生数据
func creatstudent() Student {
var stu Student
var sex, major string
fmt.Printf("请输入要添加学生的姓名:")
fmt.Scan(&stu.Name)
fmt.Printf("请输入要添加学生的性别(0:男,1:女):")
fmt.Scan(&sex)
sexint, err := strconv.Atoi(sex)
for err != nil || (sexint < 0 || sexint > 1) {
fmt.Printf("你的输入格式有误,请重新输入:")
fmt.Scan(&sex)
sexint, err = strconv.Atoi(sex)
}
if sexint == 0 {
stu.Sex = "男"
} else {
stu.Sex = "女"
}
fmt.Printf("请输入要添加学生的年龄:")
fmt.Scan(&stu.Age)
fmt.Printf("请输入要添加学生的年级:")
fmt.Scan(&stu.Grade)
fmt.Println("---------------------------------")
fmt.Println("0.计算机科学与技术\n1.软件工程\n2.数据科学与大数据\n3.区块链\n4.物联网")
fmt.Println("---------------------------------")
fmt.Printf("请输入要添加学生的专业:")
fmt.Scan(&major)
majorint, err := strconv.Atoi(major)
for err != nil || (majorint > 4 || majorint < 0) {
fmt.Printf("你的输入格式有误,请重新输入:")
fmt.Scan(&major)
majorint, err = strconv.Atoi(major)
}
switch majorint {
case 0:
stu.Major = "计算机科学与技术"
case 1:
stu.Major = "软件工程"
case 2:
stu.Major = "数据科学与大数据"
case 3:
stu.Major = "区块链"
case 4:
stu.Major = "物联网"
default:
fmt.Println("输入有误!")
}
fmt.Printf("请输入要添加学生的地址:")
fmt.Scan(&stu.Address)
return stu
}
// 查询学生信息
func querystudent() {
var stu Student
fileName := "./student.txt" //文件的路径名 ./表示当前路径
file, err := os.Open(fileName)
if err != nil {
fmt.Println("Read file err, err =", err)
return
}
defer file.Close()
//使用iouitl一次性读取全部文件内容,然后使用"\n"进行分割成行。
readBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("err=", err)
}
results := strings.Split(string(readBytes), "\n")
fmt.Println("姓名\t性别\t年龄\t班级\t专业\t\t\t地址")
fmt.Println("--------------------------------------------------------------------")
for i := 0; i < len(results); i++ {
err := json.Unmarshal([]byte(results[i]), &stu)
if err == nil {
fmt.Println(stu.Name, "\t", stu.Sex, "\t", stu.Age, "\t", stu.Grade, "\t", stu.Major, "\t", stu.Address)
}
}
fmt.Println("--------------------------------------------------------------------")
}
// 添加学生信息
func addstudent() {
stu := creatstudent()
var filename = "./student.txt"
fmt.Println(stu)
f, err := os.OpenFile(filename, os.O_APPEND, 0666)
if err != nil {
fmt.Println("err=", err)
return
}
defer f.Close()
content, err := json.Marshal(stu)
if err != nil {
fmt.Println("err=", err)
}
writer := bufio.NewWriter(f)
n, err := writer.Write([]byte(string(content) + "\n"))
if err != nil {
fmt.Println("Write file err =", err)
return
}
fmt.Println("Write file success, n =", n)
writer.Flush()
}
// 修改学生信息
func modifystudent() []Student {
var stu Student
var stuu Student
var name string
var choice, n int
var grade, major, address string
var studentslice []Student
fileName := "./student.txt" //文件的路径名 ./表示当前路径
file, err := os.OpenFile(fileName, os.O_RDWR, 0666)
if err != nil {
fmt.Println("Read file err, err =", err)
}
defer file.Close()
//使用iouitl一次性读取全部文件内容,然后使用"\n"进行分割成行。
readBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("err=", err)
}
results := strings.Split(string(readBytes), "\n")
// fmt.Println("人数:", len(results)-1)
fmt.Println("姓名\t性别\t年龄\t班级\t专业\t\t\t地址")
fmt.Println("--------------------------------------------------------------------")
for i := 0; i < len(results); i++ {
err := json.Unmarshal([]byte(results[i]), &stu)
if err == nil {
fmt.Println(stu.Name, "\t", stu.Sex, "\t", stu.Age, "\t", stu.Grade, "\t", stu.Major, "\t", stu.Address)
}
}
fmt.Println("--------------------------------------------------------------------")
fmt.Printf("请输入你要修改的学生信息的姓名:")
fmt.Scan(&name)
for i := 0; i < len(results)-1; i++ {
err := json.Unmarshal([]byte(results[i]), &stu)
if err != nil {
fmt.Println("err=", err)
}
if stu.Name == name {
fmt.Println("-----------------------")
fmt.Println("1.学生年级\n2.学生专业\n3.学生地址")
fmt.Println("-----------------------")
fmt.Printf("请选择你要修改的学生的条件:")
fmt.Scan(&choice)
switch choice {
case 1:
fmt.Printf("请输入要修改的学生的年级:")
fmt.Scan(&grade)
stuu.Name = stu.Name
stuu.Sex = stu.Sex
stuu.Age = stu.Age
stuu.Grade = grade
stuu.Major = stu.Major
stuu.Address = stu.Address
case 2:
fmt.Println("---------------------------------")
fmt.Println("0.计算机科学与技术\n1.软件工程\n2.数据科学与大数据\n3.区块链\n4.物联网")
fmt.Println("---------------------------------")
fmt.Printf("请输入要修改的学生的专业:")
fmt.Scan(&n)
switch n {
case 0:
major = "计算机科学与技术"
case 1:
major = "软件工程"
case 2:
major = "数据科学与大数据"
case 3:
major = "区块链"
case 4:
major = "物联网"
default:
fmt.Println("输入有误!")
}
stuu.Name = stu.Name
stuu.Sex = stu.Sex
stuu.Age = stu.Age
stuu.Grade = stu.Grade
stuu.Major = major
stuu.Address = stu.Address
case 3:
fmt.Printf("请输入要修改的学生的地址:")
fmt.Scan(&address)
stuu.Name = stu.Name
stuu.Sex = stu.Sex
stuu.Age = stu.Age
stuu.Grade = stu.Grade
stuu.Major = stu.Major
stuu.Address = address
}
studentslice = append(studentslice, stuu)
} else {
studentslice = append(studentslice, stu)
}
}
return studentslice
}
func modifystudentfile() {
stu := modifystudent() //返回一个student类型的切片
fmt.Println(stu)
fileName := "./student.txt"
file, err := os.OpenFile(fileName, os.O_RDWR, 0666)
if err != nil {
fmt.Println("文件打开失败的原因:", err)
}
defer file.Close()
for i := 0; i < len(stu); i++ {
content, err := json.Marshal(stu[i])
if err != nil {
fmt.Println("err44=", err)
} else {
writer := bufio.NewWriter(file)
n, err := writer.Write([]byte(string(content) + "\n"))
if err != nil {
fmt.Println("Write file err =", err)
return
}
fmt.Println("Write file success, n =", n)
writer.Flush()
}
}
}
func deletestudent() []Student {
var stu Student
var name string
var studentslice []Student
fileName := "./student.txt" //文件的路径名 ./表示当前路径
file, err := os.OpenFile(fileName, os.O_RDWR, 0666)
if err != nil {
fmt.Println("Read file err, err =", err)
}
defer file.Close()
//使用iouitl一次性读取全部文件内容,然后使用"\n"进行分割成行。
readBytes, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("err=", err)
}
results := strings.Split(string(readBytes), "\n")
fmt.Println("姓名\t性别\t年龄\t年级\t专业\t\t\t地址")
fmt.Println("--------------------------------------------------------------------")
for i := 0; i < len(results); i++ {
err := json.Unmarshal([]byte(results[i]), &stu)
if err == nil {
fmt.Println(stu.Name, "\t", stu.Sex, "\t", stu.Age, "\t", stu.Grade, "\t", stu.Major, "\t", stu.Address)
}
}
fmt.Println("--------------------------------------------------------------------")
fmt.Printf("请输入你要删除的学生信息的姓名:")
fmt.Scan(&name)
for i := 0; i < len(results)-1; i++ {
err := json.Unmarshal([]byte(results[i]), &stu)
if err != nil {
fmt.Println("err=", err)
}
if stu.Name == name {
fmt.Println("找到这个名字了")
} else {
studentslice = append(studentslice, stu)
}
}
return studentslice
}
func deletestudentfile() {
stu := deletestudent()
fmt.Println(stu)
fileName := "./student.txt"
file, err := os.OpenFile(fileName, os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0666)
if err != nil {
fmt.Println("文件打开失败的原因:", err)
}
defer file.Close()
for i := 0; i < len(stu); i++ {
content, err := json.Marshal(stu[i])
if err != nil {
fmt.Println("err44=", err)
} else {
writer := bufio.NewWriter(file)
n, err := writer.Write([]byte(string(content) + "\n"))
if err != nil {
fmt.Println("Write file err =", err)
return
}
fmt.Println("Write file success, n =", n)
writer.Flush()
}
}
}
// 登录验证函数
func login() int {
var username string
var password string
fmt.Println("--------------------------")
fmt.Println("登录界面")
fmt.Printf("请输入你的账号:")
fmt.Scan(&username)
username = strings.Trim(username, " ") //利用strings的trim方法来去除首位字符串的空格
fmt.Printf("请输入你的密码:")
fmt.Scan(&password)
password = strings.Trim(password, " ")
if username == "admin" && password == "123456" {
fmt.Println("&&&登录成功&&&")
return 1
} else {
fmt.Println("&&&登录失败&&&")
return 0
}
}
// 检查一下文件是否存在,如果不存在就创建
func checkfile() {
_, err := os.Stat("./student.txt")
if err != nil {
file, err := os.Create("./student.txt")
if err != nil {
fmt.Println("文件创建失败原因:", err)
}
defer file.Close()
} else {
fmt.Println("文件已经存在,无需再创建")
}
}
func main() {
checkfile() //如果文件不存在,就创建文件
var choice string
num := login()
if num == 0 {
return
}
for {
menu()
fmt.Printf("请输入你的操作:")
fmt.Scan(&choice)
choiceint, err := strconv.Atoi(choice)
for err != nil || choiceint < 0 || choiceint > 4 {
fmt.Printf("你的输入有误,请重新输入:")
fmt.Scan(&choice)
choiceint, err = strconv.Atoi(choice)
}
switch choiceint {
case 0:
fmt.Println("感谢你的使用")
return
case 1:
querystudent()
case 2:
addstudent()
case 3:
modifystudentfile()
case 4:
deletestudentfile()
}
}
}
运行结果:
总结
通过对这几个小项目的完成,加深了我对go语言的理解,做这些程序完成后需要考虑的一个问题就是用户输入的问题,当输入的输入不合法时,不能让程序就崩溃了,常见的输入就是数字了,如果用户输入的时字符,这个时候就会出现很多问题,我的一个解决方式就是,把用户输入的内容用一个字符串类型的变量接收,然后用"strconv"这个包来把字符串转成int类型,他有两个接收参数,一个是接收转换成数字的变量,还有一个是错误信息,如果有错误进行就继续让用户输入,直到转换成功为止,这里用个for循环就行了,这样就解决了用户不合法的字符输入。本次的小项目采用的面向过程的设计思想,每一个函数是单独的一个功能。
更多推荐
所有评论(0)