go协程笔试题
求 y=(x+1)x2 两个协程分别算
var wg sync.WaitGroup
func F1(down chan int) {
defer wg.Done()
for i := range 5 {
down <- (i + 1)
}
close(down)
}
func F2(up, down chan int) { //进行乘以2的操作
defer wg.Done()
for i := range up {
down <- i * i
}
close(down)
}
func F3(up chan int) {
defer wg.Done()
for i := range up {
fmt.Println(i)
}
}
func main() {
c0 := make(chan int)
c1 := make(chan int)
wg.Add(3)
go F1(c0)
go F2(c0, c1)
go F3(c1)
wg.Wait()
}
使用100个协程顺序打印 1 到 1000,并保证尾号为1的由协程1打印
先把功能实现了,这样就可以把结果都打印出来,并且满足要求
func main() {
chans := make([]chan int, 100)
var wg sync.WaitGroup
for i := range 100 {
chans[i] = make(chan int)
wg.Add(1)
go func(id int) {
defer wg.Done()
for n := range chans[id] {
fmt.Printf("协程号%d, num:%d\n", id, n)
}
}(i)
}
for i := 0; i < 1000; i++ {
id := i % 100
chans[id] <- i
}
for i := range 100 {
close(chans[i])
}
wg.Wait()
}
如果要求,必须从协程0 到99 的顺序打印呢?
func main() {
chans := make([]chan int, 100)
// 把这个信号量加上,就能控制打印顺序了
ack := make(chan struct{})
var wg sync.WaitGroup
for i := range 100 {
chans[i] = make(chan int)
wg.Add(1)
go func(id int) {
defer wg.Done()
for n := range chans[id] {
fmt.Printf("协程号%d, num:%d\n", id, n)
<-ack
}
}(i)
}
for i := 0; i < 1000; i++ {
id := i % 100
chans[id] <- i
// 通知协程去读
ack <- struct{}{}
}
for i := range 100 {
close(chans[i])
}
wg.Wait()
}
三个协程,交替打印 abc 10次
为了防止,思路多了,记不下来,所有的操作,都是按照上一题的思路来写
func main() {
chans := make([]chan struct{}, 3)
ack := make(chan struct{})
var wg sync.WaitGroup
for i := range 3 {
chans[i] = make(chan struct{})
wg.Add(1)
go func(id int) {
defer wg.Done()
for range chans[id] {
fmt.Printf("chan:%d,%c\n", id, 'a'+id)
<-ack
}
}(i)
}
for i := range 10 {
// 切记,得放完以后,才能通知人家通道去读呀,这两行顺序不能错了
chans[i%3] <- struct{}{}
ack <- struct{}{}
}
for i := range 3 {
close(chans[i])
}
wg.Wait()
}
2个协程,交替打印奇偶数
还是用上面那套算法,思路简单明了
func main() {
chans := make([]chan int, 2)
var wg sync.WaitGroup
ack := make(chan struct{})
for i := range 2 {
chans[i] = make(chan int)
wg.Add(1)
go func(id int) {
defer wg.Done()
for n := range chans[id] {
flag := "偶数"
if id%2 == 0 {
flag = "奇数"
}
fmt.Printf("chan:%d; %s %d\n", id, flag, n)
<-ack
}
}(i)
}
for i := range 100 {
chans[i%2] <- i
ack <- struct{}{}
}
for i := range 2 {
close(chans[i])
}
wg.Wait()
}
浙公网安备 33010602011771号