Golang学习(用代码来学习) - 第五篇
/**
并发控制:context的学习
*/
func context_test() {
PrintStartSeperator("context_test")
ctx, cancel := context.WithCancel(context.Background())
go func(ctx context.Context) {
for {
//评估条件是否可以结束,如果没有条件能够评估下来,那么执行default
select {
case <-ctx.Done():
fmt.Println("I am sub go func! I will quit!")
return
default:
fmt.Println("i am sub go func! Let's sleep somewhile")
time.Sleep(2 * time.Second)
}
}
}(ctx)
time.Sleep(4 * time.Second)
fmt.Println("I am main func. I will quit!")
//执行该函数的时候,下面的goroutine就能检测到并退出
cancel()
time.Sleep(3 * time.Second)
fmt.Println("Everything is over!!")
PrintEndSeperator()
}
type Animal interface {
get_name() string
set_name(string)
}
type Cat struct {
name string
}
/**
set方法,此处为指针传递
*/
func (c *Cat) set_name(n string) {
c.name = n
}
/**
get方法,此处为值传递
*/
func (c Cat) get_name() string {
return c.name
}
type Dog struct {
name string
}
/**
set方法,此处也为[值]传递
*/
func (d Dog) set_name(n string) {
d.name = n
}
/**
get方法,此处为值传递
*/
func (d Dog) get_name() string {
return d.name
}
//通用的打印函数
func print_animal_name(animal Animal) {
fmt.Printf("My animal:%s\n", animal.get_name())
}
//通用的打印函数
func print_all_animals(animals []interface{}) {
for _, ani := range animals {
fmt.Print("ani: ")
fmt.Println(ani)
}
}
/**
关于interface更深一步的学习,关于函数中有指针传递和值传递的
*/
func interface_test2() {
PrintStartSeperator("interface_test2")
var cat = Cat{}
cat.set_name("cat")
//print_animal_name(cat) 这个是不行的,因为cat实现中有pointer receiver,所以这里必须用指针的方式
print_animal_name(&cat)
var dog = Dog{}
dog.set_name("dog")
print_animal_name(dog) //和Cat形成对比,这里就是可以了,因为Dog没有pointer receiver的实现方式
print_animal_name(&dog) //并且这种形式也是可以的,因为go会自动对pointer进行value的转换
//var animals1 = []Animal{cat, dog} //这种是不可以的,因为cat有pointer receiver,但是Animal slice的接受值是value,所以这里会编译报错
var animals = make([]interface{}, 2)
animals[0] = cat
animals[1] = dog
print_all_animals(animals)
PrintEndSeperator()
}
/*
select的学习
*/
func select_test() {
PrintStartSeperator("select_test")
ch1 := make(chan int)
ch2 := make(chan int)
func1 := func() {
time.Sleep(time.Second * 2)
ch1 <- 1
}
func2 := func() {
time.Sleep(time.Second * 2)
ch2 <- 1
}
go func1()
go func2()
time.Sleep(time.Second * 1)
start := time.Now().Second()
for {
//对于select来讲,如果两个channel都有数据了,那么就会按顺序来case到,不需要下一次循环
select {
case <-ch1:
fmt.Println("ch1 get the message")
case <-ch2:
fmt.Println("ch2 get the message")
default:
fmt.Println("i am default")
}
time.Sleep(time.Millisecond * 200)
if time.Now().Second()-start > 4 {
break
}
}
PrintEndSeperator()
}
/**
time.ticker学习
*/
func ticker_test() {
PrintStartSeperator("ticker_test")
//每秒将会给channel发送一个消息
ticker := time.NewTicker(time.Second)
start := time.Now().Second()
group := sync.WaitGroup{}
group.Add(1)
go func() {
for {
if time.Now().Second() - start > 4 {
fmt.Println("ticker would exit!!!!")
group.Done()
return
}
select {
case <-ticker.C:
fmt.Println("ticker caught....")
default:
break
}
}
}()
//等待routine结束
group.Wait()
PrintEndSeperator()
}
Golang学习(用代码来学习) - 第五篇的更多相关文章
- 从别人的代码中学习golang系列--01
自己最近在思考一个问题,如何让自己的代码质量逐渐提高,于是想到整理这个系列,通过阅读别人的代码,从别人的代码中学习,来逐渐提高自己的代码质量.本篇是这个系列的第一篇,我也不知道自己会写多少篇,但是希望 ...
- 从别人的代码中学习golang系列--03
这篇博客还是整理从https://github.com/LyricTian/gin-admin 这个项目中学习的golang相关知识. 作者在项目中使用了 github.com/casbin/casb ...
- Golang学习(用代码来学习) - 第一篇
package main import ( "fmt" "time" "unsafe" ) //示例代码 var isActive bool ...
- Golang 汇编asm语言基础学习
Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...
- RabbitMQ学习总结 第五篇:路由Routing
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧
目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...
- 编写我的第一个CGI代码——python学习
在编程学习网站学习Python语言,学习到cgi编程章节遇到了一些小问题,课程介绍的为linux环境的Apache配置方法,具体如下: [linux环境配置方法:] 在进行CGI编程前,确保您的Web ...
- 第五篇 Getting Started with ORACLE EBS(开始学习ORACLE EBS)
第一篇介绍了ERP软件是供应链管理软件.告诉你这个软件改善或提升企业管理的切入点和着力点.有了着力点才能给力. 第二篇介绍了什么是咨询以及咨询工作共通的章法,告诉了你咨询的套路是什么,就像练习一套拳, ...
- PHP代码安全学习笔记V1.0
PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html
- Delphi之通过代码示例学习XML解析、StringReplace的用法(异常控制 good)
*Delphi之通过代码示例学习XML解析.StringReplace的用法 这个程序可以用于解析任何合法的XML字符串. 首先是看一下程序的运行效果: 以解析这样一个XML的字符串为例: <? ...
随机推荐
- ThreadLocal引起的一次线上事故
> 线上用户存储数据后查看提示无权限 前言 不知道什么时候年轻的我曾一度认为Java没啥难度,没有我实现不了的需求,没有我解不了的bug 直到我遇到至今难忘的一个bug . 线上用户存储数据后查 ...
- Etcd中Raft日志复制的实现
Raft state of log commitIndex : A log entry is committed once the leader that created the entry has ...
- MFC Object 与 Windows Object
MFC Object 和 Windows Object的含义 Window Object(Window对象)是Win32下用句柄表示的Windows操作系统对象.MFC Object(MFC对象)是C ...
- MySQL如何快速插入数据
前言: 日常学习和工作中,经常会遇到导数据的需求.比如数据迁移.数据恢复.新建从库等,这些操作可能都会涉及大量数据的导入.有时候导入进度慢,电脑风扇狂转真的很让人崩溃,其实有些小技巧是可以让导入更快速 ...
- 为什么说Zoho CRM是最好的销售预测系统?
在文章的开头,我们来讲讲什么是销售预测--销售预测是指利用销售管道中的商机.已完成的配额.有望完成目标的销售团队或个人等关键信息对产品的销售数量与销售金额进行预测的手段.企业在制定销售计划时的重要任务 ...
- Sqoop 安装部署
1. 上传并解压 Sqoop 安装文件 将 sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 安装包上传到 node-01 的 /root/ 目录下并将其解压 [root@no ...
- FireFox-background
- MyBatis 缓存机制(十三)
什么是缓存 缓存就是内存中的一个对象,用于对数据库查询结果的保存,用于减少与数据库的交互次数从而降低数据库的压力,进而提高响应速度. MyBatis 缓存机制原理 Mybatis 缓存机制原理是将第一 ...
- 收购公司、孵化(产品)和被收购的20个短篇故事-BI产品的历史
原文地址: 20 short tales of acquiring companies, incubating (ideas into products) and being acquired. | ...
- SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入
全局配置文件 全局配置文件能够对一些默认配置值进行修改.SpringBoot 使用一个名为 application.properties 或者 application.yaml的文件作为全局配置文件, ...