下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 28 | 任务的取消
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Go语言从入门到实战

共55讲 · 55课时,约700分钟
6092
免费
01 | Go语言课程介绍
免费
02 | 内容综述
免费
03 | Go语言简介:历史背景、发...
免费
04 | 编写第一个Go程序
免费
05 | 变量、常量以及与其他语言...
06 | 数据类型
07 | 运算符
08 | 条件和循环
09 | 数组和切片
10 | Map声明、元素访问及遍历
11 | Map与工厂模式,在Go语言...
12 | 字符串
13 | Go语言的函数
14 | 可变参数和defer
15 | 行为的定义和实现
16 | Go语言的相关接口
17 | 扩展与复用
18 | 不一样的接口类型,一样的...
19 | 编写好的错误处理
20 | panic和recover
21 | 构建可复用的模块(包)
22 | 依赖管理
23 | 协程机制
24 | 共享内存并发机制
25 | CSP并发机制
26 | 多路选择和超时
27 | channel的关闭和广播
28 | 任务的取消
29 | Context与任务取消
30 | 只运行一次
31 | 仅需任意任务完成
32 | 所有任务完成
33 | 对象池
34 | sync.pool对象缓存
35 | 单元测试
36 | Benchmark
37 | BDD
38 | 反射编程
39 | 万能程序
40 | 不安全编程
41 | 实现pipe-filter framew...
42 | 实现micro-kernel frame...
43 | 内置JSON解析
44 | easyjson
45 | HTTP服务
46 | 构建RESTful服务
47 | 性能分析工具
48 | 性能调优示例
49 | 别让性能被锁住
50 | GC友好的代码
51 | 高效字符串连接
52 | 面向错误的设计
53 | 面向恢复的设计
54 | Chaos Engineering
55 | 结束语
本节摘要
展开

精选留言(9)

  • 2019-04-26
    为什么每次都是4 Canceled ,不应该是从这5个协程里面随机选一个吗?
    1
    4
  • 2019-03-23
    strict{}{},作为赋值的时候,为什么有两个{}?

    作者回复: struct{}表示空结构,第二个表示实例化这个空结构

    1
    4
  • 2019-06-04
    每次都是4 Canceled 是不是说 cancel_1方法 结束的chan 是不是最后一个启动还在跑的协程
    1
  • 2019-09-28
    老师您好,
    func cancel_1传给channel一个值,isCancelled取出一个值返回true容易理解,
    在func cancel_2中,函数close了channel后,为什么isCancelled函数依然返回true?
    我改写了该程序如下,<-cancelCh自己返回的bool值在close的情况下返回的就是false,这里应该怎么理解?
    func TestCancel(t *testing.T) {
        cancelChan := make(chan int, 0)
        for i := 0; i < 5; i++ {
            go func(i int, cancelCh chan int) {
                for {
                    if _, ok := <-cancelCh; !ok {//这里ok=false?
                        break
                    }
                    time.Sleep(time.Millisecond * 5)
                }
                fmt.Println(i, "Cancelled")
            }(i, cancelChan)
        }
        close(cancelChan)
        time.Sleep(time.Second * 1)
    }
    展开

    作者回复: func isCancelled(cancelChan chan struct{}) bool {
        select {
        case <-cancelChan:
            return true
        default:
            return false
        }
    }

    close(cancelChan)会使所有处于处于阻塞等待状态的,消息接收者(<-cancelChan)返回,所以上面的代码case <-cancelChan分支就会执行下去,返回true

  • 2019-09-13
    这些小例子希望老师能分享一下使用场景,一般情况很少有死循环执行一个任务,等待处理信号,我能想到的应用场景就是做心跳检测,主进程管理子进程,心跳探测异常,所有子进程停止工作。还有多路破解验证码,其他一路成功后,可以通知其他任务停止工作。多路爬虫,搜索,一旦有成功,取消其他任务
  • 2019-08-08
    看来老师的课程学会了一个技巧,用test来写一些验证、测试等等demo来运行,以前中是用一个个main包的形式,IDE各种提示main存在等等。而且这样慢慢的对写测试更加熟悉
  • 2019-04-28
    ```go
    func TestCancel(t *testing.T) {
        cancelCh := make(chan struct{}, 0)

        for i := 0; i < 3; i++ {
            go func(i int, cc chan struct{}) {
                for {
                    if isCancelled(cc) {
                        break
                    } else {
                        fmt.Println(i, "Not Yet")
                    }
                    time.Sleep(time.Millisecond * 5)
                }
                fmt.Println(i, "Canceled")
            }(i, cancelCh)
        }
        time.Sleep(time.Millisecond * 100) // ???? 如果加上这一行, 就看不到Canceled的输出
        cancel2(cancelCh)
    }
    ```

    如果我在cancel2调用之前, 增加一个sleep, 则只会输出“Not Yet”, 不会看到“Canceled”, 请问老师这是什么原因呢?
    展开

    作者回复: 应该没有问题的,看看你是不是把cancel后面的sleep删除了

    1
  • 2019-04-18
    func cancel_2(cancelChan chan struct{}){
        close(cancelChan)
    }
    这里,为什么都会收到?没弄明白。本节课也听的有点糊涂。

    作者回复: close有一种类似广播的效果,所有处于接收等待状态的接收者都会立即返回。你在仔细看一遍视频,并试试示例代码就清楚了。

  • 2019-03-22
    追课进行时:)