/**
并发控制: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学习(用代码来学习) - 第五篇的更多相关文章

  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学习总结 第五篇:路由Routing

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

  6. 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧

    目录 学习笔记:CentOS7学习之二十五:shell中色彩处理和awk使用技巧 25.1 Shell中的色彩处理 25.2 awk基本应用 25.2.1 概念 25.2.2实例演示 25.3 awk ...

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

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

  8. 第五篇 Getting Started with ORACLE EBS(开始学习ORACLE EBS)

    第一篇介绍了ERP软件是供应链管理软件.告诉你这个软件改善或提升企业管理的切入点和着力点.有了着力点才能给力. 第二篇介绍了什么是咨询以及咨询工作共通的章法,告诉了你咨询的套路是什么,就像练习一套拳, ...

  9. PHP代码安全学习笔记V1.0

    PHP代码安全学习笔记V1.0http://www.docin.com/p-778369487.html

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

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

随机推荐

  1. Codeforces Round #691 (Div. 2)

    A. Red-Blue Shuffle 题意:有两个长度为n的数组,数组a和数组b,问那个数组中的数字相比之下比另一个数组中相应位置的元素值更大一些,如果数组a大就输出RED,如果数组b大就输出BLU ...

  2. c语言编程学习之字符串

    字符串字面量与字符变量 1.字符串字面量 字符串字面量是一对双引号括起来的字符序列.当c语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间.这块内存空间用来存 ...

  3. 黄衫女子,黄衫好.png

    正想着团队项目中数据该如何解析,就收到了来自软工课程组的一件小黄衫,真是意外之喜.详问其来源,竟是因结对项目做的"较好"而来,顿感受之有愧. 结对项目是两人对文件系统的一个小模拟, ...

  4. Docker镜像讲解

    Docker镜像讲解 镜像是什么 镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件做需要的所有的内容,包括代码,运行时,库,环境变量和配置文件. ...

  5. CSS中margin负值巧布局

    margin负值实现细边框 我们先准备五个div盒子,并设置好浮动和2px的实线黑色边框,看看效果 中间的边框线挨在了一起致使边框变粗成了4px,这时使用margin负值就可以解决这个问题 <s ...

  6. 使用JSONassert进行JSON对象对比

      在日常工作中,会接到用户提出一张订单,修改后需要记录每次修改的信息,然后需要查看修改前后的差异信息这样的需求.要实现这样的功能方式有很多.下面介绍下JSONassert的简单使用,也方便自己后续使 ...

  7. golang:协程安全

    多路复用 Go语言中提供了一个关键字select,通过select可以监听channel上的数据流动.select的用法与switch语法类似,由select开始一个新的选择块,每个选择条件由case ...

  8. [刷题] 20 Valid Parentheses

    要求 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 空字符串可被认为是有效字符串 思路 遇 ...

  9. k8s总结复习

    一.k8s介绍 Kubernetes(k8s)是Google开源的容器集群管理系统.在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模 ...

  10. stm32 向W25Q256FLASH中通过 FATFS文件系统写入数据 写多了之后出现错误,之前存储的全都找不到了

    stm32 像W25Q256FLASH中通过  FATFS文件系统写入数据  写多了之后出现错误,之前存储的全都找不到了 http://firebbs.cn/thread-23490-1-1.html ...