新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
站在用户的角度思考问题,与客户深入沟通,找到科尔沁网站设计与科尔沁网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广、主机域名、网站空间、企业邮箱。业务覆盖科尔沁地区。
go语言特点
go语言的应用领域
哪些公司(项目)在使用go语言
下载开发包
windows下安装
1.打开下载的msi可执行文件,根据提示进行安装。默认会安装在c:/Program Files/go目录下面。会自动添加go可执行文件环境变量。
2.验证安装情况
a.打开命令行
b. 输入$ go version
linux下安装
1.在/usr/local/下面创建一个目录go
2.下载压缩文件到该目录(/usr/local/go),并解压缩
3.添加/usr/local/go/bin到PATH环境变量,打开$HOME/.profile 或者/etc/profile输入如下内容:
4.执行如下命令使得配置文件及时生效
验证
1.如果你的mac有Homebrew包管理工具,可以使用它来安装
2.如果没有下载mac安装包,根据提示安装
3.默认安装在/usr/local/go下面
4.设置环境变量,同Linux
爬取器 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 ,到此为止,相互等待死锁形成!!!Engine 等待 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 的值,需要使用指针接收者。
Go提供了一种称为通道的机制,用于在goroutine之间共享数据。当您作为goroutine执行并发活动时,需要在goroutine之间共享资源或数据,通道充当goroutine之间的管道(管道)并提供一种机制来保证同步交换。
根据数据交换的行为,有两种类型的通道:无缓冲通道和缓冲通道。无缓冲通道用于执行goroutine之间的同步通信,而缓冲通道用于执行异步通信。无缓冲通道保证在发送和接收发生的瞬间两个goroutine之间的交换。缓冲通道没有这样的保证。
通道由make函数创建,该函数指定chan关键字和通道的元素类型。
这是创建无缓冲和缓冲通道的代码块:
语法
使用内置函数make创建无缓冲和缓冲通道。make的第一个参数需要关键字chan,然后是通道允许交换的数据类型。
这是将值发送到通道的代码块需要使用-运算符:
语法
一个包含5个值的缓冲区的字符串类型的goroutine1通道。然后我们通过通道发送字符串“Australia”。
这是从通道接收值的代码块:
语法
- 运算符附加到通道变量(goroutine1)的左侧,以接收来自通道的值。
在无缓冲通道中,在接收到任何值之前没有能力保存它。在这种类型的通道中,发送和接收goroutine在任何发送或接收操作完成之前的同一时刻都准备就绪。如果两个goroutine没有在同一时刻准备好,则通道会让执行其各自发送或接收操作的goroutine首先等待。同步是通道上发送和接收之间交互的基础。没有另一个就不可能发生。
在缓冲通道中,有能力在接收到一个或多个值之前保存它们。在这种类型的通道中,不要强制goroutine在同一时刻准备好执行发送和接收。当发送和接收阻塞时也有不同的条件。只有当通道中没有要接收的值时,接收才会阻塞。仅当没有可用缓冲区来放置正在发送的值时,发送才会阻塞。
实例
运行结果
go语言中的if语句和其他语言中的类似,都是根据给定的条件表达式运算结果来,判断执行流程。
注意:在go语言中 布尔表达式不用使用括号。
根据布尔值flag判断
程序运行结果
初始变量可以声明在布尔表达式里面,注意它的作用域
程序运行结果
注意:不能使用0或非0表示真假
go语言if语句使用提示:
go语言中的if else语句可以根据给定条件二选一。
比较两个数的大小
运行结果
判断一个数是奇数还是偶数
运行结果
判断一个人是否成年
运行结果
特殊写法,在if前面添加执行语句
运行结果
go语言if语句使用提示:
go语言if语句可以进行多重嵌套使用,进行多重判断。
根据分数判断等级
运行结果
同样也可以写成这样
运行结果
输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母
运行结果
go语言if语句可以嵌套多级进行判断。
判断三个数的大小
运行结果
判断男生还是女生,还有是否成年
运行结果