首页 > 其他分享 >关于golang中,defer的一个疑问

关于golang中,defer的一个疑问

时间:2023-01-12 21:12:20浏览次数:46  
标签:defer bye golang print go test main 疑问

代码如下:

package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
)

func main() {
	defer testA()
	defer testB()()
	defer testC()()()
	fmt.Println("running")
	chExit := make(chan os.Signal, 1)
	signal.Notify(chExit, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL, syscall.SIGHUP)
	select {
	case <-chExit:
		fmt.Println("capture ctrl+c command, bye bye!")
	}
}

func testA() {
	fmt.Println("test a defer print 1")
}

func testB() func() {
	fmt.Println("test b defer print 2")
	return func() {
		fmt.Println("test b defer print 3")
	}
}

func testC() func() func() {
	fmt.Println("test c defer print 4")
	return func() func() {
		fmt.Println("test c defer print 5")
		return func() {
			fmt.Println("test c defer print 6")
		}
	}
}

golang1.19环境下的输出为:

$ go run main.go
running
test b defer print 2
test c defer print 4
test c defer print 5
capture ctrl+c command, bye bye!
test c defer print 6
test b defer print 3
test a defer print 1

testA函数

testA函数的返回值在我的预期内。即在main函数结束时,执行defer。

testB函数

testB函数的返回值超出了我的预期。
我预期的结果是:

$ go run main.go
running
capture ctrl+c command, bye bye!
test b defer print 2
test b defer print 3

实际测试的结果却是:

$ go run main.go
running
test b defer print 2
capture ctrl+c command, bye bye!
test b defer print 3

我在网上查找了资料,没有明确的说法。
我自己强行解释为:testB的返回值为func,返回后被作为真正的defer执行了。而输出test b defer print 2则是golang会在将defer入栈的时候做解析。
希望有两米八的老铁能解惑!!!

标签:defer,bye,golang,print,go,test,main,疑问
From: https://www.cnblogs.com/zhimajiang/p/17047921.html

相关文章

  • windows golang 多版本管理
    下载g软件包源代码链接  https://github.com/voidint/g  二进制包连接 https://github.com/voidint/g/releases在%USERFILE%目录下.g目录创建把解压出来的g.e......
  • 防微杜渐,未雨绸缪,百度网盘(百度云盘)接口API自动化备份上传以及开源发布,基于Golang
    奉行长期主义的开发者都有一个共识:对于服务器来说,数据备份非常重要,因为服务器上的数据通常是无价的,如果丢失了这些数据,可能会导致严重的后果,伴随云时代的发展,备份技术也让......
  • golang 生成随机数
    packagemainimport("fmt""math/rand""time")funcmain(){/*rand.Seed:还函数是用来创建随机数的种子,如果不执行该步......
  • Golang实现16/32位MD5加密
    转自:Golang实现16/32位MD5加密packagemainimport( "crypto/md5" "encoding/hex" "fmt")//返回一个32位md5加密后的字符串funcGetMD5Encode(datastring)stri......
  • golang学习路线
    一、golang基础李文周的博客:https://www.liwenzhou.com/go语言中文网:https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter01/01.1.html......
  • golang数组
    目录目录数组特性语法数组内存结构数组声明数组赋值数组指针数组方法数组遍历数组类型扩展1.字符串数组2.结构体数组3.接口数组4.管道数组5.图像解码器数......
  • golang 解析xml 同时解析 attr 和 value
    xml长这样<ModifyKeys><ModifyKeyVKCode="91">LWin</ModifyKey><ModifyKeyVKCode="92">RWin</ModifyKey><ModifyKeyV......
  • Golang入门到实战核心编程-第五章-程序流程控制
    目录1.程序流程控制1.1程序流程个控制介绍1.2三大流程控制介绍及案例1.2.1顺序流程控制1.2.1.1顺利流程控制介绍1.2.1.2顺序流程控制流程图1.2.1.3顺序流程控制案例......
  • Golang入门到实战核心编程-第四章-运算符
    目录1.运算符介绍2.算数运算符2.1算数运算符介绍2.2算数运算符一览2.3算数运算符案例2.4算数运算符细节说明3.关系运算符3.1关系运算符介绍3.2关系运算符一览3.3......
  • Golang入门到实战核心编程-第三章-变量
    目录1.Golang数据类型分类2.数据类型的默认值3.数据类型及大小3.1查看变量的数据类型3.2查看变量占用字节大小4.数据类型介绍4.1整数类型4.1.1整型各个类型对比4.1......