go语言实战中 go 语言实战

Golang入门到项目实战 | golang中的if语句go语言中go语言实战中的if语句和其go语言实战中他语言中的类似,都是根据给定的条件表达式运算结果来 , 判断执行流程 。
注意go语言实战中:在go语言中 布尔表达式不用使用括号 。
根据布尔值flag判断
程序运行结果
初始变量可以声明在布尔表达式里面,注意它的作用域
程序运行结果
注意go语言实战中:不能使用0或非0表示真假
go语言if语句使用提示go语言实战中:
go语言中的if else语句可以根据给定条件二选一 。
比较两个数的大小
运行结果
判断一个数是奇数还是偶数
运行结果
判断一个人是否成年
运行结果
特殊写法,在if前面添加执行语句
运行结果
go语言if语句使用提示:
go语言if语句可以进行多重嵌套使用 , 进行多重判断 。
根据分数判断等级
运行结果
同样也可以写成这样
运行结果
输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样 , 则继续判断第二个字母
运行结果
go语言if语句可以嵌套多级进行判断 。
判断三个数的大小
运行结果
判断男生还是女生 , 还有是否成年
运行结果
Go 语言极速入门13 - 实战项目之并发版爬虫爬取器 fetcher 和解析器 parser 与之前相同,模型类也不变 。
注意:
见本小节文末分析 。
Q1. 为什么在 scheduler 中每一个将 Request 添加到 chan 的任务都开启一个 Goroutine 来执行?
A:在Go 语言学习9 - Channel一节描述过,对于无缓冲的 channel,如果两个 goroutine 没有同时准备好 , 通道会导致先执行发送或接收操作的 goroutine 阻塞等待,假设使用s.workerChan - request而不是go func() { s.workerChan - request }() ,假设开启了 10 个 Worker Goroutine,这 10 个 goroutine 阻塞在r := -in阻塞等待获取 Request 上,假设 seeds 大于 10,例如 11,那么当 Engine 的这个循环执行到底 11 个的时候,将陷入等待
,因为所有的10个 Worker goroutine 此时都可能也处于等待中,即 in chan 没有接收方准备好接收数据,所以 engine 作为发送方也要阻塞等待;那么为什么10个 Worker goroutine 都会处于等待中呢?
因为10个 Worker Goroutine 都处理完了请求,并阻塞在out - result,由于 Engine 阻塞在 “将第11个 Request 发送到 in” 上,所以其无法进行后续的死循环去开启result := -out  , 到此为止,相互等待死锁形成?。。ngine 等待 Worker 准备好r := -in,而10个 Worker 等待 Engine 的result := -out。
当使用go func() { s.workerChan - request }()之后,Engine Goroutine 将不再阻塞 , 死锁等待被打破?。。?
Q2. scheduler 方法为何使用指针接收者而不是值接收者?
A:在Go 语言学习5 - 面向接口中我们详细的介绍了什么时候使用指针接收者,什么时候使用值接收者,其中最重要的两条就是 “ 1. 如果要改变接收者内部的属性值,必须使用指针接收者,因为值接收者是对接收者副本的操作;2. 如果 struct 内一个方法是指针接收者 , 那么其全部方法都是用指针接收者 ”,在 scheduler 中,我们要将外界的 in chan 赋值给 scheduler 的 workChann,所以需要改变 workChann 的值,需要使用指针接收者 。
Golang入门到项目实战 | golang方法go语言没有面向对象的特性 , 也没有类对象的概念 。但是,可以使用结构体来模拟这些特性,我们都知道面向对象里面有类方法等概念 。我们也可以声明一些方法,属于某个结构体 。

推荐阅读