枫林火山
感谢郝老师,作为一个初学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人学习
看过的人还看了







  
 
 


