标签: defer-keyword

defer会等待子程序执行完毕吗?

我有这样的功能:

func TestDefer(lock sync.RWMutex, wait time.Duration) {

    lock.Lock()
    defer lock.Unlock()

    // start goroutine 
    go func() {
        time.Sleep(wait)
    }()
}
Run Code Online (Sandbox Code Playgroud)

我很想知道什么时候lock.Unlock()执行?与子程序同步吗go func()?会一直等到结束吗?

go subroutine goroutine defer-keyword

4
推荐指数
2
解决办法
2772
查看次数

github.com/rs/zerolog 字段的延迟评估

介绍

零日志字段

github.com/rs/zerolog在我的 golang 项目中使用。

我知道我可以使用如下方式将字段添加到输出中:

package main

import (
    "os"

    "github.com/rs/zerolog"
)

func main() {
    logger := zerolog.New(os.Stderr).With().Timestamp().Logger()
    logger.Int("myIntField", 42)
    logger.Info("a regular log output") // this log entry will also contain the integer field `myIntField`
}
Run Code Online (Sandbox Code Playgroud)

但我想要的是在行运行时评估字段logger.Info("a regular log output")的值myIntField是什么。

那个设定

我有一个带有 go-routines 的生产者/消费者设置(例如,请参阅https://goplay.tools/snippet/hkoMAwqKcwj),并且我有两个整数,它们以原子方式计算仍在运行的消费者和生产者 go-routines 的数量。在拆除消费者和生产者后,我想在运行时显示这些数字。

这是使用 log 而不是 Zerolog 时的代码:

package main

import (
    "fmt"
    "log"
    "os"
    "sync"
    "sync/atomic"
)

func main() {
    numProducers := int32(3)
    numConsumers := int32(3)

    producersRunning …
Run Code Online (Sandbox Code Playgroud)

evaluation logging go zerolog defer-keyword

3
推荐指数
1
解决办法
3317
查看次数

为什么这个程序在结果中打印421?

我不明白,为什么这个程序打印421而不是431

package main

import "fmt"

var x int
func f() int {
    x++
    return x
}

func main() {
    o := fmt.Println

    defer o(f())
    defer func() {
        defer o(recover())
        o(f())
    }()

    defer f()
    defer recover()

    panic(f())
}
Run Code Online (Sandbox Code Playgroud)

下面我添加了我猜测的评论:

package main

import "fmt"

var x int
func f() int {
    x++
    return x
}

func main() {
    o := fmt.Println

    defer o(f()) // x=1
    defer func() {
        defer o(recover()) // x=3 from panic (but if we ll …
Run Code Online (Sandbox Code Playgroud)

go panic defer-keyword

-1
推荐指数
1
解决办法
82
查看次数