学习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循环就行了,这样就解决了用户不合法的字符输入。本次的小项目采用的面向过程的设计思想,每一个函数是单独的一个功能。

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本书版权属于原作者,本人只是从网络收集到本资源,如侵犯了您的权力,请通知本人删除,本人不承担任何侵权责任。 Go语言是由谷歌的Rob Pike、Ken Thompson和Robert Griesemer共同设计开发的一种新型程序设计语言。2012年Go l的推出,代表着Go语言的稳定成熟,也正式宣告Go走人了主流语言的行列。《Go语言鄠动力》是Go语言程序设计入门书,介绍了Go语言基础知识,包括静态类型、流程控制、函数、动态类型、面向对象、并发编程等内容,以及同其他C类语言相比,Go所具备的全新特性。同时,《Go语言鄠动力》还介绍了Go语言在云计算中的应用。 云计算时代,对编程语言的要求也越来越高,而现有编程语言都无法满足大规模网络应用的需求,更无法同时满足程序员高效编译、高效执行和轻松编程的要求。2007年,Go语言应运而生。它面向Web和多核计算,强调速度,并引入了高效、低延迟的垃圾回收算法,同时精简了类型,摒弃了危险的指针运算。所有这些特点,都使得Go既容易学习,也便使用,无论是要解决手边的小问题,还是要集体完成项目,Go都是合适的通用语言。 本书作者是将Go语言在国内传播的第一人,对Go的编译器、运行器和各种包有深入研究,目前已正式成为Go语言的Contributor。本书是他这几年研究心血之结晶,旨在为读者了解Go语言、掌握Go语言提供专业的入门指导。 书中内容共分为9章,全面介绍了Go语言基础知识,以及Go语言在云计算中的应用。作者还提供了70多个完整的示例程序,方便读者边学边练,加深记忆。通过轻松简洁的介绍,读者定能顺利进入Go语言的世界。
一款基于go语言实现的reactor模型的微服务式分布式游戏架构,继承了很多c++游戏架构的思想,结合go语言的轻便与开发效率,与主流中间件的完美搭配,适用于中小型游戏,mmo等游戏.zip 源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可 源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可 源码是经过本地编译可运行的,下载完成之后配置相应环境即可使用。源码功能都是经过老师肯定的,都能满足要求,有需要放心下载即可 项目资源具有较高的学习借鉴价值,也可直接拿来修改复现。可以在这些基础学习借鉴进行修改和扩展,实现其它功能。可下载学习借鉴,你会有所收获。 项目资源具有较高的学习借鉴价值,也可直接拿来修改复现。可以在这些基础学习借鉴进行修改和扩展,实现其它功能。可下载学习借鉴,你会有所收获。 项目资源具有较高的学习借鉴价值,也可直接拿来修改复现。可以在这些基础学习借鉴进行修改和扩展,实现其它功能。可下载学习借鉴,你会有所收获。 可下载学习借鉴,你会有所收获。可下载学习借鉴,你会有所收获。可下载学习借鉴,你会有所收获。# 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。2. 部分字体以及插图等来自网络,若是侵权请联系删除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值