sync.WaitGroup的错误用法与纠正
sync.WaitGroup的错误用法与纠正本文主要是记录在学习golang语言过程中错误使用sync.WaitGroup以及指针引起的报错,并且纠正过程。 1.错误使用场景main包的实现内容: package main
import (
"fmt"
"pressure/game"
"sync"
)
var waitGroup sync.WaitGroup //定义一个同步等待的组
func main(){
waitGroup.Add(1) //添加一个计数
go game.ConnSocket(serverAddr,waitGroup) //调用其他包的方法执行任务
waitGroup.Wait() //阻塞直到所有任务完成
fmt.Println("main DONE!!!")
}
如下是game包的内容: package game
import (
"fmt"
"net"
"strconv"
"strings"
"sync"
)
var gameWait sync.WaitGroup
func ConnSocket(serverAddr string,wait sync.WaitGroup) {
var err error
Conn,err = net.Dial("tcp",serverAddr)
if err != nil {
fmt.Println("Error connected:",err.Error())
wait.Done()
return
}
gameWait = wait
fmt.Println("connected OK:",Conn.RemoteAddr())
go readMessage()
}
func readMessage() {
fmt.Println("readMessage:")
for {
if OK:=dosomething(),OK{
gameWait.Done()
}
}
}
然后执行如上的代码,会出现报错:
原因:func ConnSocket(serverAddr string,wait sync.WaitGroup)只是把sync.WaitGroup的值传递过来,而非内存地址,所以在赋值给gameWait的时候也只是赋值了值,gameWait并非指向的main里的waitGroup 的内存地址,导致 gameWait.Done()的时候并没有获取到main里的计数1,所以才会报负数。究其原因还是没有对指针的理解。所以针对上面的问题做了修改。 2.正确的使用main包的实现内容: package main
import (
"fmt"
"pressure/game"
"sync"
)
var waitGroup sync.WaitGroup //定义一个同步等待的组
func main(){
waitGroup.Add(1) //添加一个计数
//这里传递waitGroup的内存地址
go game.ConnSocket(serverAddr,&waitGroup) //调用其他包的方法执行任务
waitGroup.Wait() //阻塞直到所有任务完成
fmt.Println("main DONE!!!")
}
如下是game包的内容: package game
import (
"fmt"
"net"
"strconv"
"strings"
"sync"
)
var gameWait *sync.WaitGroup//此处也申明为指针变量
//参数传递为指针传递*sync.WaitGroup,即wait 指向的是main里的waitGroup的内存地址
func ConnSocket(serverAddr string,wait *sync.WaitGroup) {
var err error
Conn,err.Error())
wait.Done()
return
}
gameWait = wait//指针指向另一个指针,这样就做到了gameWait指向的是wait的地址,所以gameWait修改wait的内存地址锁存贮的值也会跟随改变
fmt.Println("connected OK:",OK{
gameWait.Done()
}
}
}
3.结果还是对指针传递以及值传递理解不够透彻才会出现如此问题,因此还需要多针对指针进行学习与理解。以防在以后的工作中出现类似问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |