package channel import ( "fmt" "time" "sync" ) type People struct { Name string Id int Age int Sex string State bool } /**main函数调用此方法**/ func Start() { go fmt.Println("good gogogog !") fmt.Println("golang") time.Sleep(1 * time.Second) //goroutine Publish("大家好我叫冬天",time.Second * 3) time.Sleep(1 * time.Second) fmt.Println("Ten seconds later: I’m leaving now.") TestChannel() fmt.Println("all finish...") } func Publish(text string ,delay time.Duration) { go func () { time.Sleep(delay) fmt.Println("breaking news: ", text) }() } func TestChannel() { // lc :=make(chan int) //wc :=make(chan bool,10) ch :=make(chan People) //p := People{"冬天",101,100,"男",true} // pch :=make(chan *People) go addPeople(ch) for v := range ch { fmt.Println("People is : ",v) } TestClose() TestRange() TestWait() TestRace() TestRace() TestMutex() TestWaitGroup() TestSelect() TestLast() } func addPeople (ch chan People ) { p := People{"冬天",101,100,"男",true} ch <- p close(ch) } func TestClose() { ch := make(chan string) go func(){ ch <- "冬天" close(ch) }() fmt.Println(<-ch) fmt.Println(<-ch) fmt.Println(<-ch) fmt.Println(<-ch) v,ok :=<-ch fmt.Println("ok=",ok," v =",v) } /** * 测试range channel **/ func TestRange() { ch := make(chan int) go RangeInfo(ch) for v :=range ch { fmt.Println("======= v= =====",v) } } func RangeInfo(ch chan int) { fmt.Println("我要休息...",time.Now().Format("2006-01-02 15:04:05")) time.Sleep(1 * time.Second) ch <- 100 fmt.Println("我要休息...",time.Now().Format("2006-01-02 15:04:05")) time.Sleep(1 * time.Second) ch <- 101 fmt.Println("我要休息...",time.Now().Format("2006-01-02 15:04:05")) time.Sleep(1 * time.Second) ch <- 102 fmt.Println("我要休息...",time.Now().Format("2006-01-02 15:04:05")) time.Sleep(1 * time.Second) ch <- 103 fmt.Println("我要休息...",time.Now().Format("2006-01-02 15:04:05")) time.Sleep(3 * time.Second) ch <- 104 fmt.Println("我要休息...",time.Now().Format("2006-01-02 15:04:05")) time.Sleep(1 * time.Second) ch <- 105 close(ch) } func TestWait() { ch := TestWaitInfo() fmt.Println("你就在这等待吧.....") <-ch fmt.Println("等待结束....") } func TestWaitInfo() (wait <- chan struct{}) { ch := make(chan struct{}) go func(){ fmt.Println("我要暂停了...") time.Sleep(2* time.Second) close(ch) fmt.Println("我要暂停了...") }() return ch } func TestRace() { wait := make(chan struct{}) n :=0 go func() { n ++ close(wait) }() n ++ <- wait fmt.Println(n) } func SharedIsCaring() { ch := make(chan int) go func(){ n :=0 n ++ ch <-n }() n := <- ch n++ fmt.Println(n) } type AtomicInt struct { mu sync.Mutex n int } func(a *AtomicInt) Add(n int) { a.mu.Lock() a.n +=n a.mu.Unlock() } func(a *AtomicInt) Value()( int) { a.mu.Lock() n := a.n a.mu.Unlock() return n } func TestMutex() { wait :=make(chan struct{}) var n AtomicInt go func(){ n.Add(1) //一个访问 close(wait) }() n.Add(2) //另外一个访问 <-wait fmt.Println(n) } func TestWaitGroup() { var wg sync.WaitGroup wg.Add(5) for i :=0;i<5;i++ { n :=i go func(){ fmt.Println(n) wg.Done() }() } wg.Wait() } func TestSelect() { ch := make(chan int) ch2 := make(chan bool) go func(){ ch <- 100 close(ch) ch2 <-true close(ch2) }() select { case v,ok:=<-ch: fmt.Println("===========",ok,v) case v,ok:=<-ch2: fmt.Println("ch2 ",v,ok) } } func TestLast() { people := []string{"冬天", "春天", "夏天", "秋天", "四季"} match := make(chan string,1) wg := new(sync.WaitGroup) wg.Add(len(people)) for _,name:=range people{ go Seek(name,match,wg) } wg.Wait() select { case name:=<- match: fmt.Println("接收到数据为 : ",name) default: } } func Seek(name string,match chan string,wg *sync.WaitGroup) { select { case peer:= <-match: fmt.Printf("%s sent a message to %s.\n", peer, name) case match <-name: } wg.Done() }
package main import( "fmt" "channel" ) func main(){ fmt.Println("===============") channel.Start() }
=============== golang good gogogog ! Ten seconds later: I’m leaving now. People is : {冬天 101 100 男 true} 冬天 ok= false v = 我要休息... 2016-01-20 15:13:28 我要休息... 2016-01-20 15:13:29 ======= v= ===== 100 breaking news: 大家好我叫冬天 我要休息... 2016-01-20 15:13:30 ======= v= ===== 101 我要休息... 2016-01-20 15:13:31 ======= v= ===== 102 我要休息... 2016-01-20 15:13:32 ======= v= ===== 103 我要休息... 2016-01-20 15:13:35 ======= v= ===== 104 ======= v= ===== 105 你就在这等待吧..... 我要暂停了... 我要暂停了... 等待结束.... 2 2 {{0 0} 3} 1 2 0 4 3 =========== true 100 四季 sent a message to 冬天. 春天 sent a message to 秋天. 接收到数据为 : 夏天 all finish...
相关推荐
并发编程一直是Golang区别与其他语言的很大优势,也是实际工作场景中经常遇到的。近日笔者在组内分享了我们常见的并发场景,及代码示例,以期望大家能在遇到相同场景下,能快速的想到解决方案,或者是拿这些方案与...
很少有编程语言书能不仅仅讲语言细节,还能关注很多general的topic,就算不用golang也能学到很多编程,并发,测试的技巧。原版文笔简练优美,阅读体验非常好,五星推荐。介绍了golang所有特性, 穿插了很多best ...
2. **并发支持**:Go通过goroutine和channel实现并发编程,使并发代码编写变得简单而高效,有效利用多核处理器和资源。 3. **垃圾回收**:Go具有自动垃圾回收机制,开发者不需要过多关注内存管理,提高了开发效率。...
1.3Go语言并发编程 2.1Go语言网络编程和Redis实战 2.2Go语言Web开发与数据库实战 2.3GO微信后台开发实战 3.1流媒体知识精讲和架构设计 3.2工程代码-apidefs结构体定义 3.3stream-scheduler-web详细设计 4.1Gin和jwt...
并发编程:深入Go的并发模型,包括Goroutines和Channels,掌握并发编程的技巧和错误处理。 接口与类型系统:探索Go的接口、类型断言、结构体和嵌入式类型,学习如何构建灵活的软件设计。 高级特性:学习Go的反射、...
随后,课程深入Go的并发模型,通过Goroutines和Channels,学习者将掌握并发编程的核心概念和实践技巧。 在接口与类型系统方面,课程详细讲解如何定义和实现接口,使用类型断言和嵌入式类型来构建灵活的软件设计。...
4.测试框架:Go的测试框架可以轻松地编写和运行测试代码,并提供了丰富的测试工具和断言库,如testify、gocheck等。 5.工程化工具:Go拥有众多的工程化工具,如make、go tool、godep、dep等。这些工具可以帮助...
包括-数千种代码,OOP,并发性,并行性,Goroutines,互斥体和等待组,Go中测试,Go工具链,后端Web开发,一些项目包括使用bufio.Logner的日志文件解析器,扫描仪,垃圾邮件屏蔽程序,复古LED时钟,控制台动画,...
Golang学习笔记(一):缘起及一个不一样的HelloWorld1 缘起2 安装go3 Hello World也是可以好好说道说道滴 :)3.1 编写hollo.go源代码3.2 hello.go代码说明3.3 执行程序3.4 编译程序4 结语 1 缘起 本人公司的项目后端...
使用libgo编写多线程程序,它可以像golang和Erlang并发语言一样快速和逻辑地开发,并具有C ++ native的性能优势,这使得人们可以事奉上帝和Mammon。 Libgo具有以下特征: 1.提供golang通用的强大协议,基于协程...
从Go语言的介绍和特点开始,逐步介绍了Go语言的学习方法、实际应用场景、并发模型、测试和调试工具,以及Go语言的社区和资源。通过这个教程,读者可以对Go语言有一个全面的理解,并为未来的深入学习打下坚实的基础。...
Go Playground:Go Playground是一个在线的Go语言环境,可以在浏览器中直接编写、运行和分享Go代码,非常适合学习和测试。 开发工具:Go语言支持许多主流的集成开发环境(IDE)和文本编辑器,如Visual Studio Code、...
本书共13章,主要内容包括:Go的基础[0知0]识、基本结构、基本数据类型、复合数据类型、函数、方[0法0]、接口、goroutine、通道、共享变量的并发性、包、go工具、测试、反射等。本书适合作为计算机相关专业的教材,...
面临的挑战是创建一个您自己喜欢的项目,其中包含以下元素: 值和引用类型(最后知道它们之间的区别,golang充满了惊喜) 控制流(如条件,循环等) 结构职能指针并发或并行错误处理文件纯单元测试使用Github ...