我正在阅读The Go Programming Language Specifications并发现自己并非真正理解封闭体后的"()":
在Function literals:
func(ch chan int){ch < - ACK} (replyChan) `
在Defer statements例子中:
// f returns 1
func f() (result int) {
defer func() {
result++
}() // why and how?
return 0
}
Run Code Online (Sandbox Code Playgroud)
我不清楚在封闭体之后添加和使用"()"的原因,希望有人能够清楚地解释这一点.
这是我的代码(运行):
package main
import "fmt"
func main() {
var whatever [5]struct{}
for i := range whatever {
fmt.Println(i)
} // part 1
for i := range whatever {
defer func() { fmt.Println(i) }()
} // part 2
for i := range whatever {
defer func(n int) { fmt.Println(n) }(i)
} // part 3
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
1
2
3
4
4
3
2
1
0
4
4
4
4
4
问题:第2部分和第3部分有什么区别?为什么第2部分输出"44444"而不是"43210"?
我相信我理解在正常使用情况下推迟.比如这个问题中列出的Golang defer行为.然而,当一个不返回的goroutine内部调用defer时,我有点感到困惑.这是有问题的代码.
func start_consumer() {
conn, _ := amqp.Dial("amqp://username:password@server.com")
//defer conn.Close()
ch, _ := conn.Channel()
//defer ch.Close()
q, _ := ch.QueueDeclare(
"test", // name
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
_ = ch.Qos(
3, // prefetch count
0, // prefetch size
false, // global
)
forever := make(chan bool)
go func() {
for {
msgs, _ := ch.Consume(
q.Name, // queue
"", // consumer
false, // …Run Code Online (Sandbox Code Playgroud)