/**
一个用来进行go routine的函数
*/
func print_something(msg string){
for i:= 0;i < 5;i++{
time.Sleep(1 * time.Second)
fmt.Println(msg)
}
} /**
异步相加,并将结果放在通道中
*/
func add_async(a int, b int, ch *chan int){
time.Sleep(2 * time.Second)
sum := a+ b
*ch <- sum
} /**
sleep一会儿
*/
func sleep_sometime(){
fmt.Println("start sleeping.....")
time.Sleep(2 * time.Second)
fmt.Println("end sleeping.....")
} /**
goroutine的学习
通过go来指定一个goroutime
*/
func goroutine_test() {
print_start_seperator("goroutine_test")
//启动一个go routine
go print_something("hello")
print_something("world") //执行一个异步加法
var ch = make(chan int)
go add_async(1,2,&ch)
//从通道等待结果,如果不返回,就会一直阻塞着
res := <- ch
fmt.Printf("async add res:%d\n", res) //通道也可以初始化缓冲区
var ch2 = make(chan int, 2)
ch2 <- 1
ch2 <- 2
fmt.Printf("ch2 first:%d\n", <- ch2)
fmt.Printf("ch2 second:%d\n", <- ch2) var ch3 = make(chan int, 10)
for i:= 0; i < 10;i++{
ch3 <- i
}
close(ch3) //如果通道不关闭的话,那么range就会一直卡着,从这里的代码也可以看出来,close掉channel后数据并不会消失,只是会让range
//这种迭代不会一直阻塞而等待新数据
for item := range ch3{
fmt.Printf("%d\t", item)
}
fmt.Println("") //如果说我们不等待goroutine结束,那么当函数结束后,goroutine会直接被系统结束,不会在继续执行,这点和其他语言的线程不太一样 ,可以通过channel的方式
//来完成同步
go sleep_sometime()
//为了确保我们的goroutine能执行到
time.Sleep(10 * time.Millisecond) print_end_seperator()
} func print_start_seperator(key_word string) {
fmt.Printf("**********************************************%s***************************************************\n", key_word)
} func print_end_seperator() {
fmt.Println("****************************************************************************************************")
}

Golang学习(用代码来学习) - 第四篇的更多相关文章

  1. 从别人的代码中学习golang系列--01

    自己最近在思考一个问题,如何让自己的代码质量逐渐提高,于是想到整理这个系列,通过阅读别人的代码,从别人的代码中学习,来逐渐提高自己的代码质量.本篇是这个系列的第一篇,我也不知道自己会写多少篇,但是希望 ...

  2. 从别人的代码中学习golang系列--03

    这篇博客还是整理从https://github.com/LyricTian/gin-admin 这个项目中学习的golang相关知识. 作者在项目中使用了 github.com/casbin/casb ...

  3. Golang学习(用代码来学习) - 第一篇

    package main import ( "fmt" "time" "unsafe" ) //示例代码 var isActive bool ...

  4. Golang 汇编asm语言基础学习

    Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...

  5. RabbitMQ学习总结 第四篇:发布/订阅 Publish/Subscribe

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  6. Delphi之通过代码示例学习XML解析、StringReplace的用法(异常控制 good)

    *Delphi之通过代码示例学习XML解析.StringReplace的用法 这个程序可以用于解析任何合法的XML字符串. 首先是看一下程序的运行效果: 以解析这样一个XML的字符串为例: <? ...

  7. Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例

    <<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识 ...

  8. Java学习之路 第四篇 oop和class (面向对象和类)

    本人水平有限,创作本文是为了记录学习和帮助初学者学习,欢迎指正和补充 一.面向对象编程的设计概述 很多同学都在学校学了电脑的编程,现在的书籍大部分都是oop面向对象编程,一个很抽象的的名字,比较难以理 ...

  9. 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用

    目录 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用 24.1 expect实现无交互登录 24.1.1 安装和使用expect 24.2 正则表达式的使用 24 ...

  10. 编写我的第一个CGI代码——python学习

    在编程学习网站学习Python语言,学习到cgi编程章节遇到了一些小问题,课程介绍的为linux环境的Apache配置方法,具体如下: [linux环境配置方法:] 在进行CGI编程前,确保您的Web ...

随机推荐

  1. Redis 集群伸缩原理

    Redis 节点分别维护自己负责的槽和对应的数据.伸缩原理:Redis 槽和对应数据在不同节点之间移动 环境:CentOS7 搭建 Redis 集群 一.集群扩容 1. 手动扩容 (1) 准备节点 9 ...

  2. Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析

    1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...

  3. React中diff算法的理解

    React中diff算法的理解 diff算法用来计算出Virtual DOM中改变的部分,然后针对该部分进行DOM操作,而不用重新渲染整个页面,渲染整个DOM结构的过程中开销是很大的,需要浏览器对DO ...

  4. [bug] Springboot JPA使用Sort排序时的问题

    参考 https://blog.csdn.net/qq_44039966/article/details/102713779

  5. nohup /usr/local/node/bin/node /www/im/chat.js >> /usr/local/node/output.log 2>&1 &

    nohup和&后台运行,进程查看及终止   &后台运行 登出ssh终端,进程会被自动kill掉 但是nohup >>XX.log 2>&1 & 登出终 ...

  6. 【转载】Linux踢出其他正在SSH登陆用户

    Linux踢出其他正在SSH登陆用户     在一些生产平台或者做安全审计的时候往往看到一大堆的用户SSH连接到同一台服务器,或者连接后没有正常关闭进程还驻留在系统内.限制SSH连接数与手动断开空闲连 ...

  7. Chm文件阅读软件测试需求

    转发: .Chm文件阅读软件测试需求 . xchm问题太多就不考虑了: kchm是问题少一些 windows打开是乱码就不去考虑 必须在windows打开正常的再在龙芯上打开 1windows打开是乱 ...

  8. sed常用

    行首添加字符串 # cat a [root@localhost b]# vim a 文件a将每行的第1列添加HEAD [root@localhost b]# sed 's/^/HEAD &/g ...

  9. BUUCTF(八)[极客大挑战 2019]LoveSQL

    BUUCTF 1.打开题目 注入方法可参考NewsCenter 2.测试注入点 username: 1'or'1=1 password: 1'or'1=1 登录成功,说明存在注入漏洞. 下面测试位点个 ...

  10. C语言进阶日志二

    1.一个功能模块最好使用一个文件夹包含 2.基本就需要几个文件,比如定时器取反  LED: bsp_led.c 和 bsp_led.h : 包含你需要的led外设GPIO的初始化代码 led_it.c ...