Go语言规格说明书 之 Go语句(Go statements)
go version go1.11 windows/amd64
本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 Go语句(Go statements)。
0920-0918更新:
goroutine 在很多地方被翻译为 协程,而不是本文中的 Go例程。
Go语句 用于将一个 函数调用 作为一个 独立的并发线程(an independent concurrent thread of control) 或者 叫做 Go例程(goroutine) 来执行——新建一个Go例程、立即执行,这个 新的Go例程 和 之前的程序 在同一个地址空间。
疑问,Go程序运行后——从main()函数进入——是运行一个 进程 吧?这个进程有 主线程 吧?Go例程 就是 建立了一个新的线程,和 主线程 并发 运行——在仅有一个CPU时交替使用CPU资源,在有多个CPU时,是否在不同的CPU上运行?后者是并行吧?那么,这里的并发,是否包含了并行?Go例程里面 还可以 启动新的Go例程吗?如果可以,允许的最大层级是怎样的?对于Go例程和创建它的程序共享地址空间这个问题,还不是很清楚,有什么用呢?Go例程可以使用原程序中的 变量、常量 等——读和写?
GoStmt = "go" Expression .
上面是Go语句的 语法,其中的 表达式(Expression)必须是 函数 或 方法调用,并且不能用圆括号括起来(是指Expression不能被括起来吧?把go Expression用一起括起来应该是可以的)。
虽然Expression可以是 法术 或 方法调用,但是,对于内建函数的使用是有限制的(Expression statements),下面这些 内建函数 不能出现在 语句上下文——包括Go语句 中:
append cap complex imag len make new real
unsafe.Alignof unsafe.Offsetof unsafe.Sizeof
说明,append不可以,但copy可以;复数的三个内建函数都不可以;获取长度、容量的函数不可以;new、make不可以;还有unsafe包中的几个函数——暂不清楚它们的用处。
在Go例程中,函数的值和参数 和 正常调用 一样被求值,但和正常调用不同的是,程序的执行 不会 等到被调用的函数完成,相反,程序开始在一个新的Go例程中独立地执行。
在函数 终止 时,它的Go例程也会终止。如果函数有返回值,这些返回值会在函数完成时被 丢弃。
解读,根据上面的信息,Go例程 有什么用途呢?可以用在什么地方呢?耗时操作?Web服务器 的一个用户请求处理程序?一个程序 可以新建多少Go例程呢?和计算机的资源多少有关系?新建的Go例程只能在本机运行吗?可以指派到其它计算机上执行——实现分布式执行?一台电脑的程序 被 放到 另一台电脑执行,感觉像是 控制了另一台电脑?Go语言本身是否支持这样的操作?不然的话,一定会有其它软件实现方式的。毕竟那么多病毒程序都已经实现了。
官文示例:
go Server()
go func(ch chan<- bool) { for { sleep(10); ch <- true }} (c) // 注意这里的 (c),这是函数调用 的 括号 及 参数
上面的官文示例就太简单了,下面给出一个复杂一些的——来自网络:
通过 筛选法 寻找素数——这个程序俺大致看懂了,晚点会彻底看懂它。
原文链接不知道在哪里了,网上可以搜索到类似的链接,比如,http://www.yankay.com/go-clear-concurreny/ (Go-简洁的并发),
package main import (
"fmt"
) // Send the sequence 2, 3, 4, ... to channel 'ch'
func generate(ch chan<- int) {
for i := 2; ; i++ {
ch <- i // Send 'i' to channel 'ch'
}
} // Copy the values from channel 'src' to channel 'dst',
// removing those divisible by 'prime'.
func filter(src <-chan int, dst chan<- int, prime int) {
for i := range src { // Loop over values received from 'src'
if i%prime != 0 {
dst <- i // Send 'i' to channel 'dst'
}
}
} // The prime sieve: Daisy-chain filter processes together.
func sieve() {
ch := make(chan int) // Create a new channel.
go generate(ch) // Start generate() as a subprocess.
for {
prime := <-ch
fmt.Print(prime, "\n")
ch1 := make(chan int)
go filter(ch, ch1, prime)
ch = ch1
}
} func main() {
sieve()
}
参考链接
2.Go-简洁的并发
后记
好了,很清楚Go例程是什么了,但是还有一些疑问需要搞清楚!
另外,Go语言 内置 的并发特性有什么好处呢?好需要更多实践来体会才是!
在官文Effective Go中有一节名为Concurrency,稍候会好好看看,有需要,再补充此文——估计不会的了。
学习编程语言,就是为了 解决问题,要亲自写代码去解决问题。
比如上面的寻找素数的问题,若是自己来写,用Go语言来写,会写成什么样呢?估计是不会用Go例程的!可先行者们知道用Go例程了,看来自己的Go学习之路还有些漫长呢!
只有继续投入精力了!
还有Go开发者可以使用Go语言开发区块链程序了,感觉好高级啊!
什么时候自己也可以写点 高级的程序呢?
从上月末开始学(接触)Go开发,直到现在都还没 用Go写一个Web服务器出来,方式方法&行动力都存在严重问题啊!
需反省,改进!
Go语言规格说明书 之 Go语句(Go statements)的更多相关文章
- Go语言规格说明书 之 select语句(Select statements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 通道 发送语句(send) 和 接收操作符(receive)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 通道类型(Channel types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 内建函数(Built-in functions)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 词汇元素(Lexical elements)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 接口类型(Interface types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
- Go语言规格说明书 之 变量声明(Variable/Short variable declarations)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 类型(Types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,完整的介绍Go语 ...
- Go语言规格说明书 之 结构体类型(Struct types)
go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...
随机推荐
- Flash与JavaScript互动
最近做的一个项目需要用javascript来实现自动复制文本到剪切板,但测试时发现只有ie6.0支持. 到百度搜索后才发现,原来ie7.0.firefox是不支持这样的操作的,随后又搜索了一下,找到一 ...
- spread与react
我们写react组件的过程中会遇到这个 我们知道react中的{},浏览器会知道说是以js的形式进行解析出来.那么怎么解析...props呢? 这个就涉及到es6中的扩展运算符了,我们先看下面的一些运 ...
- 一次有趣的ant-design与后端数据交互的使用
最近有个需求是新闻时间排序与点击量排序,数据库中存储的新闻是按照时间顺序排序的,从后台数据中取出数据,在前端进行页面展示即可. 我用到了ant-design中的Tabs切换页,样式大概如下图. 其实这 ...
- idea tomcat上传图片,无法显示的问题解决
真是浪费时间啊,之前eclipse下的tomcat 去webapps下找就行了,这倒好,idea下根本没有. 我上传的目录建在项目中的static中了,upload文件夹,上传到这里肯定是找不到了的: ...
- 关于navicat远程连接mysql问题
如果你想连接你的mysql的时候发生这个错误: ERROR 1130: Host '192.168.1.81' is not allowed to connect to this MySQL serv ...
- 20145215《网络对抗》Exp3 免杀原理与实践
20145215<网络对抗>Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 基于特征来检测:恶意代码中一般会有一段有较明显特征的代码也就是特征码,如果杀毒软件检测到有 ...
- CISCO知识扫盲
cisco知识扫盲 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.vlan简介 1.什么是VLAN 简称虚拟局域网.至于英语怎么写自行百度吧. VLAN的优势: 1>.广 ...
- layui(一)——layDate组件常见用法
和 layer 一样,我们可以在 layui 中使用 layDate,也可直接使用 layDate 独立版,可按照实际需求来选择.options整理如下: layui.use('laydate', f ...
- .NET MVC中的数据验证
一 概述 关于数据验证和数据注解,是任何软件系统不可小觑的必要模块,主要作用是为了保证数据安全性.防止漏洞注入和网络攻击.从数据验证的验证方式来说,我们一般分为客户端验证和服务端验证(或者两种方式相 ...
- .NET Framework自带的文件内存映射类
最近一直为文件内存映射发愁,整个两周一直折腾这个东西.在64位系统和32位系统还要针对内存的高低位进行计算.好麻烦..还是没搞定 偶然从MSDN上发现.NET 4.0把内存文件映射加到了.NET类库中 ...