Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
檀越@新空间
Coding Tree
提交
2cbebd0d
C
Coding Tree
项目概览
檀越@新空间
/
Coding Tree
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Coding Tree
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
2cbebd0d
编写于
9月 29, 2022
作者:
彭世瑜
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix
上级
1d2b2b2c
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
251 addition
and
1 deletion
+251
-1
blog/golang/golang-concurrency.md
blog/golang/golang-concurrency.md
+249
-0
blog/golang/index.md
blog/golang/index.md
+2
-1
未找到文件。
blog/golang/golang-concurrency.md
浏览文件 @
2cbebd0d
...
...
@@ -544,3 +544,252 @@ func main() {
```
## golang并发编程之Channel遍历
示例
```
go
package
main
import
"fmt"
var
c
=
make
(
chan
int
)
func
main
()
{
go
func
()
{
for
i
:=
0
;
i
<
2
;
i
++
{
c
<-
i
}
// 不关闭可能出现死锁
close
(
c
)
}()
// 方式一
// for i := 0; i < 2; i++ {
// v := <-c
// fmt.Printf("v: %v\n", v)
// }
// 方式二
// for v := range c {
// fmt.Printf("v: %v\n", v)
// }
// 方式三
for
{
v
,
ok
:=
<-
c
if
ok
{
fmt
.
Printf
(
"v: %v
\n
"
,
v
)
}
else
{
break
}
}
}
```
## golang并发编程之select switch
select 是go中的一个控制结构,类似于switch语句,用于处理异步IO操作
select 会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作
sekect 中的case语句必须是一个channel操作
select 中的default子句总是可运行的
如果有多个case都可以运行,select会
`随机`
公平地选出一个执行,其他不会执行
如果没有可运行的case语句,且有default语句,那么就会执行default语句
如果没有可运行的case语句,且没有default语句,select将
`阻塞`
,知道某个case通信可以运行
示例
```
go
package
main
import
(
"fmt"
"time"
)
var
chanInt
=
make
(
chan
int
)
var
chanString
=
make
(
chan
string
)
func
main
()
{
go
func
()
{
chanInt
<-
10
chanString
<-
"Tom"
defer
close
(
chanInt
)
defer
close
(
chanString
)
}()
for
{
select
{
case
i
:=
<-
chanInt
:
fmt
.
Printf
(
"int: %v
\n
"
,
i
)
case
i
:=
<-
chanString
:
fmt
.
Printf
(
"string: %v
\n
"
,
i
)
default
:
fmt
.
Println
(
"default"
)
}
time
.
Sleep
(
time
.
Second
)
}
}
```
## golang并发编程之Timer
定时器,可以实现一些定时操作,内部通过channel实现
示例
```
go
package
main
import
(
"fmt"
"time"
)
func
main
()
{
timer
:=
time
.
NewTimer
(
time
.
Second
*
2
)
fmt
.
Printf
(
"time.Now(): %v
\n
"
,
time
.
Now
())
// time.Now(): 2022-09-29 22:31:16.348683 +0800 CST m=+0.000252176
// 阻塞,直到到达指定时间
c
:=
<-
timer
.
C
fmt
.
Printf
(
"c: %v
\n
"
,
c
)
// c: 2022-09-29 22:31:18.35269 +0800 CST m=+2.004256507
}
```
示例
```
go
package
main
import
(
"fmt"
"time"
)
func
main
()
{
timer
:=
time
.
NewTimer
(
time
.
Second
*
2
)
fmt
.
Printf
(
"time.Now(): %v
\n
"
,
time
.
Now
())
// time.Now(): 2022-09-29 22:32:25.585226 +0800 CST m=+0.000134248
// 阻塞,直到到达指定时间
<-
timer
.
C
fmt
.
Printf
(
"time.Now(): %v
\n
"
,
time
.
Now
())
// time.Now(): 2022-09-29 22:32:27.585439 +0800 CST m=+2.000219266
}
```
示例
```
go
package
main
import
(
"fmt"
"time"
)
func
main
()
{
fmt
.
Printf
(
"time.Now(): %v
\n
"
,
time
.
Now
())
// time.Now(): 2022-09-29 22:34:08.764178 +0800 CST m=+0.000082405
time
.
Sleep
(
time
.
Second
*
2
)
fmt
.
Printf
(
"time.Now(): %v
\n
"
,
time
.
Now
())
// time.Now(): 2022-09-29 22:34:10.765022 +0800 CST m=+2.000924537
}
```
示例
```
go
package
main
import
(
"fmt"
"time"
)
func
main
()
{
fmt
.
Printf
(
"time.Now(): %v
\n
"
,
time
.
Now
())
// time.Now(): 2022-09-29 22:34:41.029391 +0800 CST m=+0.000077713
<-
time
.
After
(
time
.
Second
*
2
)
fmt
.
Printf
(
"time.Now(): %v
\n
"
,
time
.
Now
())
// time.Now(): 2022-09-29 22:34:43.031081 +0800 CST m=+2.001766091
}
```
示例
```
go
package
main
import
(
"fmt"
"time"
)
func
main
()
{
timer
:=
time
.
NewTimer
(
time
.
Second
*
1
)
go
func
()
{
<-
timer
.
C
fmt
.
Println
(
"func"
)
}()
// 停止定时器
stop
:=
timer
.
Stop
()
if
stop
{
fmt
.
Println
(
"stop"
)
}
time
.
Sleep
(
time
.
Second
*
2
)
}
```
示例
```
go
package
main
import
(
"fmt"
"time"
)
func
main
()
{
timer
:=
time
.
NewTimer
(
time
.
Second
*
5
)
// 重新设置定时器时间
timer
.
Reset
(
time
.
Second
*
1
)
<-
timer
.
C
fmt
.
Println
(
"end"
)
}
```
blog/golang/index.md
浏览文件 @
2cbebd0d
...
...
@@ -52,4 +52,5 @@
https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=72&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=75&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录