大佬教程收集整理的这篇文章主要介绍了golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
package main
import (
"fmt"
// "os"
"time"
)
func test(){
var i int
for {
fmt.Println(i)
time.Sleep(time.Second)
i++
}
}
func main() {
go test()
for {
fmt.Println("running in main")
time.Sleep(time.Second)
}
}
利用go 启动一个goroute
先进先出
线程安全,多个goroutIne同时访问,不需要加锁
chAnnel是有类型的,一个整数的chAnnel只能存放整数
package main
import (
"fmt"
// "fmt"
)
type stu struct{
name String
}
func main() {
//int类型
var intChan chan int
intChan = @H_483_91@make(chan int,10)
intChan <- 10
a := <- intChan
fmt.Println(a)
fmt.Println("--------/map类型---------")
//map类型
var mapChan chan @H_878_29@map[String]String
mapChan = @H_483_91@make(chan @H_878_29@map[String]String,10)
m:= @H_483_91@make(@H_878_29@map[String]String,16)
m["stu01"] = "001"
m["stu02"] = "002"
m["stu03"] = "003"
mapChan <- m
b := <- mapChan
fmt.Println(b)
fmt.Println("--------结构体---------")
//结构体
var stuChan chan stu
stuChan = @H_483_91@make(chan stu,10)
stu:= stu{
name:"safly",}
stuChan <- stu
tempstu := <- stuChan
fmt.Println(tempstu)
fmt.Println("--------结构体内存地址---------")
//结构体内存地址值
var stuChanId chan *stu
stuChanId = @H_483_91@make(chan *stu,10)
stuId := &stu{
name:"safly",}
stuChanId <- stuId
tempstuId := <- stuChanId
fmt.Println(tempstuId)
fmt.Println(*(tempstuId))
fmt.Println("-----------接口---------")
//接口
var stuInterChain chan interface{}
stuInterChain = @H_483_91@make(chan interface{},10)
stuInit:= stu{
name:"safly",}
//存
stuInterChain <- &stuInit
//取
mFetchstu:= <- stuInterChain
fmt.Println(mFetchstu)
//转
var mstuConvert *stu
mstuConvert,ok := mFetchstu.(*stu)
if !ok{
fmt.Println("cAnnot convert")
return
}
fmt.Println(mstuConvert)
fmt.Println(*(mstuConvert))
}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go
10
--------/map类型---------
@H_476_35@map[stu03:003 stu01:001 stu02:002]
--------结构体---------
{safly}
--------结构体内存地址---------
&{safly}
{safly}
-----------接口---------
&{safly}
&{safly}
{safly}
PS E:\golang\go_pro\src\safly>
package main
import (
"time"
"fmt"
)
func main() {
intChan := @H_483_91@make(chan int,5)
go write(intChan)
go read(intChan)
time.Sleep(10 *time.Second)
}
/* 由于管道容量是5,开启go写入10个数据,再写入5个数据, 会阻塞, 然而read每秒会读取一个,然后在会写入一个数据 */
func write(ch chan int){
for i:= 0;i<10;i++{
ch <- i
fmt.Println("put data:",i)
}
}
func read(ch chan int){
for{
var b int
b = <- ch
fmt.Println(b)
time.Sleep(time.Second)
}
}
测试输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go
put data: 0
put data: 1
put data: 2
put data: 3
put data: 4
put data: 5
0
1
put data: 6
2
put data: 7
3
put data: 8
4
put data: 9
5
6
7
8
9
PS E:\golang\go_pro\src\safly>
package main
import "fmt"
func main() {
var ch chan int
ch = @H_483_91@make(chan int, 5)
for i := 0; i < 5; i++ {
ch <- i
}
close(ch)
for {
var b int
b,ok := <-ch
if ok == false {
fmt.Println("chan is close")
break
}
fmt.Println(b)
}
}
输出如下:
PS E:@H_673_619@\golang@H_673_619@\go_pro@H_673_619@\src@H_673_619@\safly> go run demo.go 0 1 2 3 4 chan is close PS E:@H_673_619@\golang@H_673_619@\go_pro@H_673_619@\src@H_673_619@\safly>
如果将close(ch)注释掉,意思是不关闭管道,那么会出现dead lock死锁
因为存入管道5个数字,然后无限取数据,会出现死锁
package main
import "fmt"
func main() {
var ch chan int
ch = @H_483_91@make(chan int, 10)
for i := 0; i < 10; i++ {
ch <- i
}
close(ch)
for v := range ch {
fmt.Println(v)
}
}
输出如下:
PS E:@H_673_619@\golang@H_673_619@\go_pro@H_673_619@\src@H_673_619@\safly> go run demo.go 0 1 2 3 4 5 6 7 8 9 PS E:@H_673_619@\golang@H_673_619@\go_pro@H_673_619@\src@H_673_619@\safly>
同样如果将close(ch)注释掉,意思是不关闭管道,那么会出现dead lock死锁 因为存入管道10个数字,然后无限取数据,在取出来第10个数据,在次range管道,会dead lock
以上是大佬教程为你收集整理的golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取全部内容,希望文章能够帮你解决golang基础-goroutine初识、chan存取、goroutine和chan相结合、关闭chan、range取所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。