Administrator
Administrator
发布于 2026-04-22 / 11 阅读
0
0

defer 参数提前求值

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now().UnixMilli())
	
	defer fmt.Println(time.Now())
	// 或
	defer test1(time.Now().UnixMilli())

	time.Sleep(3 * time.Second)
}

func test1(a int64) {
	fmt.Println("test1", a)
}
# output:
1776816489353

#三秒后:
test1 1776816489353
1776816489353

三个时间居然是一样的,后面2个时间戳应该和第一个相差3000毫秒。这是因为传递给fmt.Println和test1函数中的参数会立即计算出来


更明显的例子:

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now().UnixMilli())
	defer test1(getVal())

	time.Sleep(3 * time.Second)
}

func test1(a int64) {
	fmt.Println("test1", a)
}
func getVal() int64 {
	fmt.Println(time.Now().UnixMilli(), "求值")
	return 100
}


//output:
1776821498304
1776821498304 求值
//三秒后
test1 100

用函数包裹,打印三秒后的时间

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now().UnixMilli())

	defer func() {
		fmt.Println(time.Now().UnixMilli())
	}()

	time.Sleep(3 * time.Second)
}

原文地址:https://dave.cheney.net/2025/12/18/pop-quiz-what-time-was-it


评论