`程序运行流程:`
读取userc和passc 数组,开启2个线程,2个线程同时使用一个数组,操作读取。
`遇到的问题:`
按照目前的代码,我pr()每次打印后,线程都会关闭,在重新开启一个线程,我并不希望这2个主要的线程结束,我想让这2个线程y一直运行,一直操作数组,将数组的值都遍历完,然后一起结束。
```go
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var wgi int = 1
var limit int = 2 //线程数量
func pr(user, pass string) {
fmt.Println(user, pass)
}
func main() {
userc := []string{"13362011111", "13362022222", "13362033333", "13362444444"}
passc := []string{"123456", "000000"}
limitChan := make(chan struct{}, limit)
for _, user := range userc {
for _, pass := range passc {
wg.Add(wgi)
limitChan <- struct{}{}
go func(user1, pass1 string) {
pr(user1, pass1)
<-limitChan
wg.Done()
}(user, pass)
}
}
wg.Wait()
}
```
![image.png](https://static.studygolang.com/220120/a3914b17b19e1a17ad45029e7bfcd388.png)
如果可以加个context 让协程退出 ,如果main函数不退出的情况下
#1
更多评论
1 楼的代码可能有点问题,无缓冲区,可能会导致最后一条数据没来得及打印就退出。
楼主可以写的更简单一点,如下:
```
type Info struct {
Name string
Password string
}
func main() {
userc := []string{"13362011111", "13362022222", "13362033333", "13362444444"}
passc := []string{"123456", "000000"}
limitChan := make(chan Info, 0)
go func() {
for _, user := range userc {
for _, pass := range passc {
limitChan <- Info{
Name: user,
Password: pass,
}
}
}
close(limitChan)
}()
for v := range limitChan {
fmt.Printf("%v,%v\n", v.Name, v.Password)
}
}
```
#2