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的字符串为例: <? ...
随机推荐
- php中的一些碎的知识点
PHP函数之可变函数,即可以通过变量的名字来调用函数,因为变量的值是可变的,所以可以通过改变一个变量来调用不同的函数 例如 function name(){ echo "name&q ...
- DOM0和DOM2事件的应用和区别详细对比
1.触发次数 零级事件只能注册一次,如果注册多次,后面的会覆盖前面的 btn.onclick = function () { alert(1) } btn.onclick = function () ...
- cent7 配 yum源
今天笔记配置CentOS 7本地镜像为yum源,废话不多说,上去就是干! 1:挂镜像: ? 1 2 3 4 #创建目标挂载目录 mkdir /media/CentOS7 #将镜像挂载到目标目录 mou ...
- 使用 dd 命令进行硬盘 I/O 性能检测
使用 dd 命令进行硬盘 I/O 性能检测 作者: Vivek Gite 译者: LCTT DongShuaike | 2015-08-28 07:30 评论: 1 收藏: 6 如何使用dd命令测 ...
- Centos 7 进入单用户模式更改root密码方法
进入单用户模式的方法 方法一: 1.开机进入grub菜单的时候上下选择,按e编辑. 到linux16所在行的最后面. ro 只读文件系统 biosdevname=0 戴尔的服务器需要设置 net.if ...
- Lombok 插件安装和使用
引言 以前的 Java 项目中,充斥着太多毫无技术含量的代码,比如类属性的 getter/setter/toString 方法,还有就是异常处理.I/O 流的关闭操作等.这些样板代码虽然可以通过 ID ...
- 8.12-14 df 、mkswap、swapon、swapoff、sync
8.12 df:报告文件系统磁盘空间的使用情况 -a 显示所有文件系统 -h 以容易理解的格式显示磁盘的使用情况端 -i 显示文件系统的inode信息迷 -t 显示指定类型 ...
- 技术干货 | 关于 WKWebview 网络拦截,你想知道的都在这里
原生 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此在 WKWebView 上直接使用 NSURLProtocol 是无法拦截请求的. 但是由于 mPa ...
- 原型和原型链 prototype和proto的区别
原型 原型是function对象下的属性,它定义了构造函数的共同祖先,也就是一个父子级的关系,子对象会继承父对象的方法和属性 prototype是函数下的属性,对象想要查看原型使用隐式属性__Prot ...
- 基于Jira的运维发布平台的设计与实现
作者:乔克 公众号:运维开发故事 上线发布是运维的日常工作,常见的发布方式有: 手动发布 Jenkins发布平台 Gitlab CI ...... 除此之外还有需要开源软件,他们都有非常不错的发布管理 ...