枫林火山
感谢郝老师,作为一个初学go语言的人老师的专栏就像是effective系列一样让我从一个较高的视角进入go的世界,从标准库开始我已经逐渐跟不上了,坚持灌耳音😂。
在Go武侠世界里秘籍已经读过了,该下山去历练了,先读再抄后写,最后终成一代高手(意淫中🤣)。
最后祝您身体早日康复!
作者回复:谢谢!加油!
2019-04-18
Geek_f62433
感谢郝老师,真的是go中的核心内容了,而且与面试相关,实用性很强
作者回复:不客气,对你有帮助就好:)
2022-02-19
Berry He
非常感谢有这样的专栏出现,因公司业务需求兼职做了go,加上业务繁多没有多少时间进行系统的学习,也同样祝你身体健康,也祝所有同学能在开发的道路上一路披荆斩棘,所向披靡!
2018-12-24
我来也
祝老师早日康复!
我是今年才下定决心开始学go。有一次在Twitter上看见池大在推荐这个专栏,我就毫不犹豫的买了。(当时完全不了解池大和老师你的传奇经历)这是我在极客时间购买的第一个专栏。现在跟着学的专栏也有十几个。
刚开始学这个专栏时,就顺便在 慕课网 上找了老师的一个免费课程,跟着学了基本的语法。
今年自己用go重构了公司里的一个程序,放在了生产环境中,我自己还是蛮满意的。
谢谢老师领进门,专栏里后面系统库的知识我理解起来有困难,还需要回头多看看。
再次感谢老师!
作者回复:也谢谢你,加油!
2018-12-08
6
闪电瘸子
刚开始觉得作者的语言过于严谨, 读起来很费劲. 后来想想没什么不好, 我们需要轻松欢快的讲解入门, 也得有作者这样严谨学术的风格去进阶.
祝好
作者回复:谢谢。
2020-04-28
lesserror
先听一遍音频,对课程内容做个简单的了解。然后再把课程demo或者go源码文件看看,边看边结合文字说明。就很清晰明了了。
2021-09-03
3
清风
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
type User struct { //模拟用户
mail *Mail
name string
}
type Mail struct { //模拟邮箱
mail bool
msg int
sendCond *sync.Cond
recvCond *sync.Cond
lock sync.RWMutex
}
func NewMail() *Mail {
m := Mail{}
m.sendCond = sync.NewCond(&m.lock)
m.recvCond = sync.NewCond(&m.lock)
return &m
}
func (u *User) SendMail() {
u.mail.lock.Lock()
for u.mail.mail {
fmt.Println(u.name + ":已经有邮件了等待接收")
u.mail.sendCond.Wait()
}
u.mail.mail = true
u.mail.msg = rand.Intn(1000000)
fmt.Println(u.name + "发送了一封邮件")
u.mail.lock.Unlock()
u.mail.recvCond.Broadcast() //向接收者发送消息
}
func (u *User) RecvMail() {
u.mail.lock.Lock()
for !u.mail.mail {
fmt.Println(u.name + ":没有邮件,等待发送邮件")
u.mail.recvCond.Wait()
}
u.mail.mail = false
fmt.Printf("%s:收到一封邮件: %d\n", u.name, u.mail.msg)
u.mail.lock.Unlock()
u.mail.sendCond.Signal()
}
func main() {
mail := NewMail()
lock := make(chan struct{}, 3)
use1 := User{
mail: mail,
name: "jacky",
}
use2 := User{
mail: mail,
name: "rose",
}
use3 := User{
mail: mail,
name: "allen",
}
//send mail
go func() {
defer func() {
lock <- struct{}{}
}()
for {
use1.SendMail()
time.Sleep(time.Second + time.Millisecond * time.Duration(rand.Intn(100)))
}
}()
//recv mail
go func() {
defer func() {
lock <- struct{}{}
}()
for {
use2.RecvMail()
time.Sleep(time.Second + time.Millisecond * time.Duration(rand.Intn(100)))
}
}()
//recv mail
go func() {
defer func() {
lock <- struct{}{}
}()
for {
use3.RecvMail()
time.Sleep(time.Second + time.Millisecond * time.Duration(rand.Intn(100)))
fmt.Println()
}
}()
<-lock
<-lock
<-lock
}
2021-01-18
Geek_adf04b
相比自己看书学习,听高人讲课学习效率是真高,之前绕半天的问题,这里一张图片就讲明白了,课程买晚了。
2020-09-15
1
www
这篇讲解太棒了,看了lock.RLocker()的源码,又返回去看了前面第14篇讲解接口的文章。多看多写,逐步提升
2020-06-28
1
涛声依旧
原子操作虽然快,但使用场景有限;锁虽然使用麻烦,但使用场景较多;这是我对锁与原子操作的理解;
作者回复:是的,鱼和熊掌难以兼得。
2020-03-28
5
编辑推荐
包含这门课的学习路径
Go工程师
16门课程 89.0w人学习
看过的人还看了