注意事项
- 执行时机:
defer
语句会在函数返回前执行,无论函数以何种方式返回(正常返回或通过panic
异常返回)。在多值返回函数中,要注意defer
语句不会影响函数返回值的计算顺序,返回值会在defer
语句执行前就确定下来。
- 对返回值的影响:如果在
defer
语句中修改了返回值(通过命名返回值变量),会改变最终的返回结果。但如果返回值是匿名的,defer
语句无法直接修改返回值。
代码示例
package main
import (
"fmt"
"os"
)
func readFileContents(filePath string) (string, error) {
file, err := os.Open(filePath)
if err != nil {
return "", err
}
defer file.Close()
var data []byte
data, err = os.ReadFile(filePath)
if err != nil {
return "", err
}
return string(data), nil
}
资源释放与影响阐述
- 资源释放:在上述函数中,
defer file.Close()
确保了无论os.ReadFile
操作是否成功,文件最终都会被关闭。这是因为defer
语句会在函数返回前执行,保证了文件描述符这个资源的正确释放,防止资源泄漏。
- 对多值返回结果的影响:由于返回值在
defer
语句执行前就已确定,所以defer
语句中的file.Close()
操作不会影响readFileContents
函数的返回值。如果函数在os.ReadFile
之前就返回错误,defer
语句依然会执行文件关闭操作,而不会改变已确定的错误返回值。如果函数成功读取文件内容,defer
执行的文件关闭也不会干扰已确定的内容和nil
错误返回值。