一:Go的实战
Go项目实战-猜字游戏
本项目主要包括随机数的生成,用户输入的读取以及实现游戏逻辑的判断
1.随机数的生成
在以前的java学习用,随机数是使用random函数来实现的,而在Go中则是需要调用“math/rand”来实现
axNumber := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNumber)
fmt.Println("The secret number is ", secretNumber)
首先是定义一个最大值100,然后time使用的目的是因为rand使用需要设置随机数种子,负责每一次都会生成相同的随机数数列,所以我们使用time时间戳来初始化,再然后是使用rand.Intn来生成随机数,最后是打印输出获得的随机数
2.用户输入的读取
我所知道的用户输入读取只有scanf和Scanner,一个是在c语言,一个是在java学习的,老师上课讲授的是使用bufio.NewReader将os.Stdin转换为reader变量,然后使用read.ReadString来读取一行,将结果的换行符去掉并转换为数字
reader := bufio.NewReader(os.Stdin)
//读取一行输入
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Try again", err)
return
}
//去掉换行符
input = strings.TrimSuffix(input, "\n")
// 转换成数字
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invaild input")
return
}
fmt.Println("You guess is", guess)
3.逻辑判断
逻辑判断主要是使用了if-else语句
主要形式为if xxx {
fmt.Println("xxx")
else if{
fmt.Println("xxx")
}
} 后面两个例子没有太掌握,故不再详细阐述
二:Go进阶
Go语言进阶主要讲了并行,并发Goroutine,CSP,Channel,安全Lock下面详细讲述
1.并发与并行
并发指的是多线程程序在一个核的cpu上运行,同时管理很多东西,并行指的是多线程程序在多个核的cpu上运行,同时做很多事情
Goroutine是轻量级的线程,与线程相比很小,成本也更低
如何使用:在函数或者方法前面加上关键字go,可以运行一个Goroutine
func hello() {
fmt.Println("Hello world goroutine")
}
func main() {
go hello()
fmt.Println("main function")
}
输出结果为:
main function
2.CSP模型
csp就是一种通信模型,与其他通信模型不同的是,go采用的csp是提倡通过通信共享内存而不是通过共享内存而实现通信
3.Channel
channel是引用类型,需要时用make来实现,可以分为无缓冲通道和有缓冲通道
make(chan int)
make(chan int,2)
他是在多个 goroutine 之间传递数据和同步的重要手段类似于通道
4.安全Lock
Go语言中使用lock来确保过程过不出问题,共享内存实现通信的机制会出现问题,使用lock可以确保数据不出问题。
三.依赖管理
1.依赖管理的过程从GOPATH到GO Vendor,再到Go Module的过程
Gopath就是我们熟悉的环境变量,分为src存放代码,pkg存放编译产物,bin存放生成的二进制文件,但缺点是无法实现package多版本的控制
Go Vendor解决package多版本问题,但是无法处理当版本更新出现的问题
Go Moudle 是通过go.mod文件管理依赖包版本,使用go get/go mod指令工具管理依赖包,解决了诸多问题
2.依赖管理三要素:
配置文件,描述依赖。中心仓库依赖库。本地工具
依赖配置: go.mod是启用Go modules项目所必需的最重要文件,启动一个项目时首先就需要go mod,而依赖单元中的indirect后缀表示go.mod对应的当前模块,没有直接导入该以来的包,为间接依赖,incompatible是没有go.mod文件且主版本在2或者以上时增加后缀
依赖分发: 依赖分发就是哪里下载,如何下载的问题;从指定的仓库中下载软件依赖,存在多个问题,无法保证构建准确性,因为代码是可以修改的。无法保证依赖可用性,代码或者软件可能被删除,无法使用。增加第三方平台代码托管压力
本地工具: go get和go mod两种