Go 语言从入门到实战
蔡超
Mobvista 技术副总裁兼首席架构师,前亚马逊(中国)首席软件架构师
48919 人已学习
新⼈⾸单¥59
课程目录
已完结/共 55 讲
第一章:Go语言简介 (4讲)
第二章:基本程序结构 (4讲)
第三章:常用集合 (3讲)
第四章:字符串 (1讲)
时长 16:47
第五章:函数 (2讲)
第六章:面向对象编程 (4讲)
第七章:编写好的错误处理 (2讲)
第八章:包和依赖管理 (2讲)
第九章:并发编程 (7讲)
第十章:典型并发任务 (5讲)
第十一章:测试 (3讲)
时长 11:48
时长 07:12
时长 06:15
第十二章:反射和Unsafe (3讲)
时长 08:18
时长 08:03
第十三章:常见架构模式的实现 (2讲)
第十四章:常见任务 (4讲)
时长 04:27
时长 05:14
第十五章:性能调优 (4讲)
第十六章:高可用性服务设计 (5讲)
Go 语言从入门到实战
登录|注册
留言
18
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 31 | 仅需任意任务完成
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | Go语言课程介绍
02 | 内容综述
03 | Go语言简介:历史背景、发展现状及语言特性
04 | 编写第一个Go程序
05 | 变量、常量以及与其他语言的差异
06 | 数据类型
07 | 运算符
08 | 条件和循环
09 | 数组和切片
10 | Map声明、元素访问及遍历
11 | Map与工厂模式,在Go语言中实现Set
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 framework
42 | 实现micro-kernel framework
43 | 内置JSON解析
44 | easyjson
45 | HTTP服务
46 | 构建RESTful服务
47 | 性能分析工具
48 | 性能调优示例
49 | 别让性能被锁住
50 | GC友好的代码
51 | 高效字符串连接
52 | 面向错误的设计
53 | 面向恢复的设计
54 | Chaos Engineering
55 | 结课测试&结束语
登录 后留言

全部留言(18)

  • 最新
  • 精选
NEVER SETTLE
我比较喜欢老师一边敲代码,一边讲。这样我可以完全跟着思路走,一边就能懂。但是老师提前写好代码,上来直接讲,我有点懵,我每次得暂停把代码看明白了,再继续往下走,有时候再播放第二遍。

作者回复: 我也希望尽量这样。主要是后面的课程内容相对前面的每一课都多不少,为满足平台对时长的限制,只能将一些代码事先准备好。也建议可以下载我们github上的代码在机器上运行和调试。谢谢

2019-03-26
11
www
之前看了网上几套讲解Golang语言基础教程,感觉讲解得不那么透彻。直到这套课程,虽然间断,不会十分详细,需要自己下来多查资料,但逻辑清晰,例子很实用,逐渐能够体会到Golang的独特之处,感谢蔡生,希望多出视频

作者回复: 谢谢🙏

2020-06-19
2
2
NIXUS
老师, 如果使用sync.WaitGroup的话, 发现每次输出的, After的gorountine的数量都是不同的, 这个应该怎么理解呢? package ch22 import ( "fmt" "runtime" "sync" "testing" "time" ) var wg sync.WaitGroup func runTask(id int) string { time.Sleep(time.Millisecond * 10) return fmt.Sprintf("The result is from %d", id) } func FirstResponse() string { numOfRunner := 10 ch := make(chan string, numOfRunner) for i := 0; i < numOfRunner; i++ { go func(i int) { ch <- runTask(i) }(i) } abc := <-ch wg.Done() return abc } func TestFirstResponse(t *testing.T) { t.Log("Before:", runtime.NumGoroutine()) wg.Add(1) t.Log(FirstResponse()) wg.Wait() // time.Sleep(time.Second) t.Log("After:", runtime.NumGoroutine()) }

作者回复: 在检查协程数之前sleep一秒试试,让协程有时间完成和释放

2019-04-02
2
escray
我觉的 Go 语言的作者,其实是把并发编程中的一些痛点拿出来,做了专门的优化,比如这一讲的“仅需任意任务完成”。 我对于 WaitGroup 和 Channel close 部分的代码似乎有些混淆,希望后面能慢慢理清楚。 使用 buffer channel 可以避免协程泄漏,那么是不是在大部分的情况下,都应该优先 buffer channel 而不是 unbuffered channel? 老师在留言里面回复了大部分的代码问题,这个还是挺难得的,当然总体留言数目不多。 我也从留言里面学到很多。

作者回复: 至于使用buffered chan还是使用阻塞chan,重点也要看看你要不要发送者和接收者见同步

2021-04-10
1
Geek_ea3747
func getFirst() string { ch := make(chan string) for i := 0; i < 2; i++ { go func(i int) { fmt.Println("start:" + strconv.Itoa(i)) time.Sleep(500 * time.Millisecond) ch <- "return:" + strconv.Itoa(i) fmt.Println("finish:" + strconv.Itoa(i)) }(i) } return <-ch } func TestFirstRes(t *testing.T) { fmt.Println(getFirst()) time.Sleep(5 * time.Second) } 打印结果类似: start:1 start:0 finish:0 return:0 有一个一直没有执行到finish , 没有结束的那个携程会因为一直无法写入chan而等待吗 ? 如果程序一直不结束, 这个携程的最终结果会怎么样 ?

作者回复: 是的,那个协程会被阻塞。这就造成了携程泄漏

2021-03-12
2
Geek_62f799
老师 不使用channel buffer的时候我这里为什么始终都是返回0啊。如果改改task时间可能会变,但是在task时间不变的情况下,返回的协程号始终是一样的

作者回复: 粘贴一下你的实验代码

2020-12-28
寒溪
那么问题来了如何确保buffer>协程数量 否则依然有泄露的风险

作者回复: 判断是否有问题的核心就是是不是有协程被阻塞

2020-12-18
未来
老师,不是很理解为什么before :2 ,当第一个数据放入ch中并被取走后,after 为什么还是2,不是应该所有携程都释放了?是因为执行输出after的时候,其他协程还没开始吗?

作者回复: 是的。还有其他协程。

2020-06-05
gofer
API server listening at: 127.0.0.1:58598 === RUN TestFirstResponse TestFirstResponse: first_response_test.go:28: Before: 2 TestFirstResponse: first_response_test.go:29: The result is from 5 TestFirstResponse: first_response_test.go:30: The result is from 4 TestFirstResponse: first_response_test.go:31: The result is from 0 TestFirstResponse: first_response_test.go:33: After: 11 --- PASS: TestFirstResponse (0.03s) 老师,麻饭您解释下,用完协程反而变多了的原因?

作者回复: t.Log("Before:", runtime.NumGoroutine()) t.Log(FirstResponse()) time.Sleep(time.Second * 1) t.Log("After:", runtime.NumGoroutine()) 你是不是没有Sleep呢,协程还没有释放回收

2020-03-29
风骑
我按照第一种方式测试,一直都是输出的同一个结果,我问了同事,他说是channel里面有个队列机制,希望老师能解答下这个问题吧,周围也没咨询到能够给出答案的人,麻烦老师了

作者回复: 你运行的是下面代码,由于协程的调度是随机的,所以第一个返回channel的结果也是随机的,你可以多运行几次看看,可以通过命令行 go test -v 试试。 package concurrency import ( "fmt" "runtime" "testing" "time" ) func runTask(id int) string { time.Sleep(10 * time.Millisecond) return fmt.Sprintf("The result is from %d", id) } func FirstResponse() string { numOfRunner := 10 ch := make(chan string, numOfRunner) for i := 0; i < numOfRunner; i++ { go func(i int) { ret := runTask(i) ch <- ret }(i) } return <-ch } func TestFirstResponse(t *testing.T) { t.Log("Before:", runtime.NumGoroutine()) t.Log(FirstResponse()) time.Sleep(time.Second * 1) t.Log("After:", runtime.NumGoroutine()) }

2020-01-18
2
收起评论