我有这样的功能:
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()?会一直等到结束吗?
我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) 我不明白,为什么这个程序打印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)