MST
星途 面试题库

面试题:Go多值返回与defer结合应用

请描述在一个涉及多值返回的函数中使用defer语句的注意事项。并编写一个函数,该函数打开一个文件,读取内容,以多值返回读取到的数据和可能出现的错误,同时合理使用defer关闭文件。阐述defer在这个过程中如何确保资源正确释放以及对多值返回结果的影响。
23.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

注意事项

  1. 执行时机defer语句会在函数返回前执行,无论函数以何种方式返回(正常返回或通过panic异常返回)。在多值返回函数中,要注意defer语句不会影响函数返回值的计算顺序,返回值会在defer语句执行前就确定下来。
  2. 对返回值的影响:如果在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
}

资源释放与影响阐述

  1. 资源释放:在上述函数中,defer file.Close()确保了无论os.ReadFile操作是否成功,文件最终都会被关闭。这是因为defer语句会在函数返回前执行,保证了文件描述符这个资源的正确释放,防止资源泄漏。
  2. 对多值返回结果的影响:由于返回值在defer语句执行前就已确定,所以defer语句中的file.Close()操作不会影响readFileContents函数的返回值。如果函数在os.ReadFile之前就返回错误,defer语句依然会执行文件关闭操作,而不会改变已确定的错误返回值。如果函数成功读取文件内容,defer执行的文件关闭也不会干扰已确定的内容和nil错误返回值。