英文:
Wait for a function to finish in golang
问题
我可以帮你翻译代码部分,以下是你提供的代码的中文翻译:
func A(){
go print("hello")
}
func main() {
A()
// 在这里,我想要等待打印完成后再执行B()
B()
}
你想知道如何确保只有在打印完成后才执行B()函数。
英文:
I have the following code in golang:
func A(){
go print("hello")
}
func main() {
A()
// here I want to wait for the print to happen
B()
}
How can I somehow ensure that B() will be executed only after the print has happened?
答案1
得分: 1
使用sync.Mutex:
var l sync.Mutex
func A() {
go func() {
print("你好")
l.Unlock()
}()
}
func B() {
print("世界")
}
func TestLock(t *testing.T) {
l.Lock()
A()
l.Lock()
// 在这里我想要等待打印完成
B()
l.Unlock()
}
使用sync.WaitGroup:
var wg sync.WaitGroup
func A() {
go func() {
print("你好")
wg.Done()
}()
}
func B() {
print("世界")
}
func TestLock(t *testing.T) {
wg.Add(1)
A()
wg.Wait()
// 在这里我想要等待打印完成
B()
}
使用chan:
func A() chan struct{} {
c := make(chan struct{})
go func() {
print("你好")
c <- struct{}{}
}()
return c
}
func B() {
print("世界")
}
func TestLock(t *testing.T) {
c := A()
// 在这里我想要等待打印完成
<-c
B()
}
英文:
Use sync.Mutex
var l sync.Mutex
func A() {
go func() {
print("hello")
l.Unlock()
}()
}
func B() {
print("world")
}
func TestLock(t *testing.T) {
l.Lock()
A()
l.Lock()
// here I want to wait for the print to happen
B()
l.Unlock()
}
Use sync.WaitGroup
var wg sync.WaitGroup
func A() {
go func() {
print("hello")
wg.Done()
}()
}
func B() {
print("world")
}
func TestLock(t *testing.T) {
wg.Add(1)
A()
wg.Wait()
// here I want to wait for the print to happen
B()
}
Use chan
func A() chan struct{} {
c := make(chan struct{})
go func() {
print("hello")
c <- struct{}{}
}()
return c
}
func B() {
print("world")
}
func TestLock(t *testing.T) {
c := A()
// here I want to wait for the print to happen
<-c
B()
}
答案2
得分: 0
你可以选择以下两种方式:
1)将A()函数改为同步执行:
func A(){
print("hello") // 去掉go关键字
}
这样,你可以确保在A()函数返回后,print()函数已经执行完毕。
2)等待print()函数执行完毕后再进行下一步操作。
使用一个简单的通道:
func A() chan struct{}{
c := make(chan struct{})
go func(){
print("hello")
close(c)
}
return c
}
func main() {
c := A()
// 在这里等待print()函数执行完毕
<-c
B()
}
你也可以使用sync.Waitgroup
或x/sync.Errgroup
来实现。
英文:
You could either
- make A() synchronous
func A(){
print("hello") // go keyword removed
}
This way you are sure that print()
has been executed after A
returns
- Wait for something that only happens after the
print()
execution
With a simple channel:
func A() chan struct{}{
c := make(chan struct{})
go func(){
print("hello")
close(c)
}
return c
}
func main() {
c := A()
// here I want to wait for the print to happen
<-c
B()
}
You could also use a sync.Waitgroup
or x/sync.Errgroup
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论