Go-常见的面试题(一)

1、写出下面代码的输出

package main

import "fmt"

func main() {
	defer_all()
	panic("触发异常")
}

func defer_all()  {
	defer func() {
		fmt.Println("打印前")
	}()
	defer func() {
		fmt.Println("打印中")
	}()
	defer func() {
		fmt.Println("打印后")
	}()
}

  解析:这道题主要考察的是对 defer 的理解,defer 主要是延迟函数,延迟到调用者函数执行 return 命令之前,

多个 defer 之前按照先进后出的顺序执行,所以,这道题中,在 panic 触发时结束函数运行,在 return 之前依次打

印:打印后、打印中、打印前。最后 runtime 运行时抛出打印 panic 异常信息

        需要注意的是,函数的 return value 不是原子操作,而是在编译器中被分解成两部分:返回值和return,而我们

知道 defer 是在 return 之前执行的,所以可以在 defer 函数中修改返回值,如下示例:

package main

import (
	"fmt"
)

func main() {
	fmt.Println(doubleScore(0))    //0
	fmt.Println(doubleScore(20.0)) //40
	fmt.Println(doubleScore(50.0)) //50
}
func doubleScore(source float32) (score float32) {
	defer func() {
		if score < 1 || score >= 100 {
			//将影响返回值
			score = source
		}
	}()
	score = source * 2
	return

	//或者
	//return source * 2
}

  持续更新。。。。。。

 

上一篇:script标签async和defer的区别及作用


下一篇:Go-延时函数defer