【发布时间】:2023-03-07 20:28:01
【问题描述】:
我正在使用sync 为两个函数循环运行 go 例程,以等待 go 例程完成,然后在循环外运行一个普通函数,例如:
func fetchStudentsAndTeachers(db *sqlx.DB, token string) {
var students Students
var teachers Teachers
wg := &sync.WaitGroup{}
// defer wg.Wait()
tch := make(chan Teachers)
schoolList := fetchActiveOrganization(DB)
std := make(chan Students)
for key, value := range schoolList {
value2 := value
fmt.Println(key, ":", value)
wg.Add(1)
go func() {
defer wg.Done()
std <- fetchStudentsFromSchool(wg, value2.CleverSchoolID, token)
}()
wg.Add(1)
go func() {
defer wg.Done()
tch <- fetchTeachersFromSchool(wg, value2.CleverSchoolID, token)
}()
students = <-std
// teachers = <-tch
}
wg.Wait() // It panics after this point
UpdateOrganizationsAndUsers(DB)
close(std)
close(tch)
fmt.Println(students)
fmt.Println(teachers)
}
现在的问题是当我跳出循环时给我的索引超出范围错误。在从wg.Wait() 转发调试器的控制权后,我检查了在wg.Wait() 上使用了 delve 调试器。它惊慌失措地说:
恐慌:运行时错误:索引超出范围
(已编辑) 注意:此问题是由于循环迭代一次并运行处理数据库的例程。但不知何故,在导致错误的例程完成之前循环再次迭代。在下一次迭代之前我应该怎么做才能完成这两个例程。
【问题讨论】:
-
能否请您查看有关 panic 的 stact 跟踪数据,以检查哪些行和例程导致此错误!
-
是的,请参阅
wg.Wait()行上的评论 -
您的代码是否在
wg.Wait或之后 出现恐慌?例如UpdateOrganizationsAndUsers? -
在
wg.Wait()它永远不会执行UpdateOrganizationsAndUsers -
@Himanshu 你知道代码的哪一部分索引超出了范围吗?您能否提供完整的堆栈跟踪,以便我们查看错误的文件+行号。