当前位置: 首页 > 面试题库 >

对指针使用延迟

羊舌诚
2023-03-14
问题内容

让我们说我有以下代码:

func getConnection(fileName string) *os.File {
    file, err := os.Open(fileName)
    //Check for error
    return file
}

我使用此函数打开文件,然后从执行其他活动的另一个函数调用该函数。

我的问题是,既然我已经打开文件,如何关闭它。如果要在defer file.Close()里面添加getConnection()文件,在返回之前是否会关闭文件?在调用函数中使用defer是否有意义?


问题答案:

如果函数的目的是返回文件,为什么要在返回文件的函数中将其关闭?

在这种情况下, 调用者 有责任正确关闭文件,最好使用defer

func usingGetConnection() {
    f := getConnection("file.txt")
    defer f.Close()
    // Use f here
}

尽管您的getConnection()函数吞没了错误,但是您应该使用多次返回值来指示类似以下问题:

func getConnection(fileName string) (*os.File, error) {
    file, err := os.Open(fileName)
    //Check for error
    if err != nil {
        return nil, err
    }
    return file, nil
}

并使用它:

func usingGetConnection() {
    f, err := getConnection("file.txt")
    if err != nil {
        panic(err) // Handle err somehow
    }
    defer f.Close()
    // Use f here
}


 类似资料:
  • 本文向大家介绍解析C++中指向对象的指针使用,包括了解析C++中指向对象的指针使用的使用技巧和注意事项,需要的朋友参考一下 C++指向对象的常指针 将指针变量声明为const型,这样指针值始终保持为其初值,不能改变。 如: 定义指向对象的常指针的一般形式为: 也可以在定义指针变量时使之初始化,如将上面第2, 3行合并为: 请注意,指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其

  • 每个对象都可以通过 this 指针访问自己的地址。对象的 this 指针不是对象本身的一部分,即 this 指针不在对该对象进行 sizeof 操作的结果中体现。但this指针在每次非static成员函数调用对象时(static 成员见7.7节介绍)作为第一个隐式参数传递给对象(通过编译器)。 this 指针隐式引用对象的数据成员和成员函数(当然也可以显式使用)。this 指针的类型取决于对象类型

  • 问题内容: 我习惯于进行Java编程,在编程时,您无需真正考虑指针。但是,此刻我正在用C ++编写程序。在创建具有其他类成员的类时,何时应该使用指针,何时不应该使用指针?例如,什么时候我想这样做: 与此相反: 问题答案: 首先避免指针。 在以下情况下使用它们: 您想使用Pimpl习惯用法或抽象工厂。 该实例实际上是由程序的其他部分管理的,而该类仅需要能够访问它。 您想推迟对象的构建(即,您想 在

  • 指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为 二级指针,或者 指向指针的指针。 假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语言代码: 指针变

  • 我试图理解地址计算指令是如何工作的,尤其是使用< code>leaq命令。然后,当我看到使用< code>leaq进行算术计算的例子时,我会感到困惑。例如,下面的C代码, 在组装中, 如果我的理解是对的,leaq应该移动任何地址,应该是,评估为。我感到困惑的是,既然值x存储在中,这只是内存地址,为什么乘以%rdi 3然后左移这个内存地址2等于x乘以12?当我们乘以3时,我们不是跳转到另一个不保存值

  • 在C/C中,我们知道指针。也就是说,一个可变的内存地址。 比如,下面的代码不会编译,但其思想是: 地址的地址我们能走多远。“最终地址”在哪里?