Go语句和通道类型是Go语言的并发编程理念的最终体现。与defer语句相同,go语句也可以携带一个表达式语句。Go语句的执行会很快结束,并不会对当前流程的进行造成阻塞或明显的延迟。一个简单的示例:

go fmt.Println("Go")

go语句仅由一个go关键字和一条表达式语句组成。同样的,go语句的执行与其携带的表达式语句的执行在时间上没有必然联系。这里能确定的仅仅是后者会在前者完成之后发生。在go语句被执行时,其携带的函数(也称为go函数)以及要传给它的若干参数会被封装成一个实体(即Goroutine),并被放入到相应的待运行队列中。Go语言的运行时系统会适时的从队列中取出待运行的Goroutine并执行相应的函数调用操作。注意,对传递给这里的函数的那些参数的求值会在go语句被执行时进行。
  正是由于go函数的执行时间的不确定性。所以Go提供了很多方法来协调它们的运行。其中最简单粗暴的方法就是time.Sleep函数:

package main

import {
"fmt"
} func main() {
go fmt.Println("Go!")
}

上面的代码运行时,不会有任何输出,因为还没等go语言运行时系统调用那个go函数执行主函数main就已经执行完毕了。函数main的执行完毕意味着整个程序的执行的结束。因此,这个go函数就不会执行。
  当我们在上述go语句的后面添加一条对time.Sleep函数的调用语句之后情况就不同了:

package main

import {
"fmt"
"time"
} func main() {
go fmt.Println("Go!")
time.Sleep(100 * time.Millisecond)
}

语句time.Sleep(100 * time.Millisecond)会把main函数的执行结束时间向后延迟100毫秒,这样go函数就会被调度执行了。
  另外比较优雅的做法是在main函数的最后调用runtime.Gosched函数:

package main

import {
"fmt"
"runtime"
} func main() {
go fmt.Println("Go")
runtime.Gosched()
}

runtime.Gosched函数的作用是让当前正在运行的Goroutine(这里是运行main函数的那个Goroutine)暂时“休息”一下,而让Go运行时系统转去运行其他的Goroutine(这里是与go fmt.Println("Go!"))对应并会封装fmt.Println("Go!")的那个Goroutine)。
  还有另外的方法可以满足上述需求。如果我们要控制更多的Goroutine的运行时机的话,下面的方法更好:

package main

import {
"fmt"
"sync"
} func main() {
var wg sync.WaitGroup
wg.Add(3)
go func () {
fmt.Println("Go!")
wg.Done()
}() go func() {
fmt.Println("Go!")
wg.Done()
}() go func() {
fmt.Println("Go!")
wg.Done()
}() wg.Wait()
}

sync.WaitGroup类型有三个方法可用--Add、Done和Wait。Add会使其所属值的一个内置整数得到相应增加,Done会使那个整数减1,而wait方法会使当前Goroutine阻塞直到那个整数为0。上例中,我们在main函数中启用了三个Goroutine来封装三个Go函数。每个匿名函数的最后都调用了wg.Done方法。并以此表达当前的go函数会立即执行结束的情况。当这三个go函数都调用过wg.Done函数之后,处于main函数最后的那条wg.Wait()语句就不会阻塞,main函数的执行将立即结束。

Golang 笔记 5 go语句的更多相关文章

  1. golang笔记1

    golang笔记1 go代码是用包来组织的,每个包有一个或多个go文件组成,这些go文件文件放在一个文件夹中 每个源文件开始都用一个package声明,指明本源文件属于哪个包 pakage声明后紧跟这 ...

  2. Golang笔记(一)简洁的语言风格

    Golang笔记(一)简洁的语言风格 概述 Golang继承了很多C语言的风格,寡人使用了十几年C语言,切换到Golang时上手很快,并且随着深入的使用,越来越喜欢这门语言.Golang最直观的感受是 ...

  3. Golang笔记(二)面向对象的设计

    Golang笔记(二)面向对象的设计 Golang本质还是面向过程的语言,但它实现了一些OOP的特性,包括抽象.封装.继承和多态. 抽象和封装 Golang和C语言一样以struct为数据结构核心,不 ...

  4. 【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句

    原文:[SQL Server学习笔记]Delete 语句.Output 子句.Merge语句 DELETE语句 --建表 select * into distribution from sys.obj ...

  5. Golang 笔记 3 if、switch、for、select语句

    一.if语句 Go的流程控制主要包括条件分支.循环和并发.  if语句一般由if关键字.条件表达式和由花括号包裹的代码块组成.在Go中,代码块必须由花括号包裹.这里的条件表达式是结果类型为bool的表 ...

  6. Golang笔记整理--One day

    题外话: 很早就有整理学习笔记的想法,今天将想法付诸于行动,将Golang相关知识系统整理一遍,此分类为Golang学习笔记,最近开始学习这门语言的同学可以参考. 一 第一个Go程序: hello.g ...

  7. golang笔记——函数与方法

    如果你遇到没有函数体的函数声明,表示该函数不是以Go实现的. package math func Sin(x float64) float //implemented in assembly lang ...

  8. Golang 笔记 1 基础、基本数据类型

    一.Go语言基础 1. 基础 Go语言中的标识符必须以字母(Unicode字母,PHP/JS可以用中文作为变量名)下划线开头.大写字母跟小写字母是不同的:Hello和hello是两个不同的名字.  G ...

  9. golang笔记:unsupported driver -> Scan pair: <nil> -> *string

    golang里,操作mysql数据库,使用查询语句的时候,一般的写法 rows, err := db.Query("select name from table") if err ...

随机推荐

  1. day7接口开发

    一.数据库操作, 1.创建游标时指定游标类型为字典,返回值类型为字典,方便取值 cur = coon.cursor(cursor=pymysql.cursor.Dictursor) 2.获取执行查询S ...

  2. selenium3 文件系列之------读取properties文件

    一个eclipse工程会有很多配置文件,有的配置文件是写在properties里,也有写在xml文件里的.这个总结一下是自动化测试是如何读取properties文件. 一.准备config.prope ...

  3. Vue(十一)计算属性

    计算属性 1. 基本用法 计算属性也是用来存储数据,但具有以下几个特点: a.数据可以进行逻辑处理操作 b.对计算属性中的数据进行监视 2.计算属性 vs 方法 将计算属性的get函数定义为一个方法也 ...

  4. 【高精度&想法题】Count the Even Integers @ICPC2017HongKong/upcexam5563#Java

    时间限制: 1 Sec 内存限制: 128 MB Yang Hui's Triangle is defined as follow. In the first layer, there are two ...

  5. [Asp.net core]使用ssh命令发布asp.net core项目

    命令 # 移除之前发布的包 rm -rf ./.Publish rm -rf ./Wolfy.Blog.tar.gz # 编译并发布 将发布包打包在.Publish目录下 -o "../.P ...

  6. 本机ip、127.0.0.1和0.0.0.0区别及内环流量

    本机ip.127.0.0.1和0.0.0.0区别及内环流量 所谓内环流量 简单的说是指 计算机内部,程序间通讯产生的流量,或者叫 本地流量,对应的是来自网络的流量. 比如,你安装了卡巴斯基,avast ...

  7. u3d不显示阴影的处理方法

    正常情况下都会显示的,如果没有显示,尝试以下几种方案: 1)缩小模型看一看 2)旋转灯光试试,看是否有阴影 3)检查阴影设置 菜单栏Edit –> Project Settings –> ...

  8. Django表单介绍

    HTML 表单 在HTML中,表单是<form>...</form> 之间元素的集合,它们允许访问者输入文本.选择选项.操作对象和控制等等,然后将信息发送回服务器. 某些表单的 ...

  9. js实现sleep

    1.这种不是匀速, 写到for循环中出现1,2,3.......456....的情况 function sleep(milliseconds) { var start = new Date().get ...

  10. 美国FICO评分系统简介

    美国的个人信用评分系统,主要是Fair IsaacCompany 推出的 FICO,评分系统也由此得名.一般来讲, 美国人经常谈到的你的得分 ,通常指的是你目前的FICO分数.而实际上, Fair I ...