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

在简短的变量声明中从其他块中重新声明变量

尚河
2023-03-14
问题内容

如何在简短的变量声明中从其他块中重新声明变量?

func f() (err os.Error) {
    proc, err := os.StartProcess(blah blah blah)
    // the new err masks the return value?
}

关于此问题有很长的话题,但现在我很感兴趣如何解决此问题。


问题答案:

简短的变量声明的Go规范很明确:

短变量声明可以重新声明变量,只要它们最初是在同一块中以相同类型声明的,并且至少一个非空变量是新变量。

因此,在简短的变量声明中,您无法重新声明最初在其他块中声明的变量。

这是一个如何通过e在内部块中声明局部变量()并将其(e)分配给err2在外部块中声明的变量()来解决此限制的示例。

package main

import (
    "fmt"
    "os"
)

func f() (err1 os.Error, err2 os.Error) {
    fi, err1 := os.Stat("== err1 os.Error ==")
    _ = fi
    {
        fi, e := os.Stat("== e os.Error ==")
        _ = fi
        err2 = e
    }
    return
}

func main() {
    err1, err2 := f()
    fmt.Println("f() err1:", err1)
    fmt.Println("f() err2:", err2)
}

输出:

f() err1: stat == err1 os.Error ==: no such file or directory
f() err2: stat == e os.Error ==: no such file or directory

这是前面的示例,改写为使用显式正则变量声明和命名函数参数,而不是隐式短变量声明。变量声明始终可以显式地编写为常规变量声明或命名函数参数。隐式短变量声明只是常规变量声明的简写。

package main

import (
    "fmt"
    "os"
)

func f() (err1 os.Error, err2 os.Error) {
    var fi *os.FileInfo
    fi, err1 = os.Stat("== err1 os.Error ==")
    _ = fi
    {
        var fi *os.FileInfo
        fi, err2 = os.Stat("== err2 os.Error ==")
        _ = fi
    }
    return
}

func main() {
    err1, err2 := f()
    fmt.Println("f() err1:", err1)
    fmt.Println("f() err2:", err2)
}

输出:

f() err1: stat == err1 os.Error ==: no such file or directory
f() err2: stat == err2 os.Error ==: no such file or directory

在您的示例中,短变量声明errred重新声明了err; 的返回参数声明。他们在同一个街区。因此,新方法err不会屏蔽return参数err



 类似资料:
  • 问题内容: 在Java中,我们不能与另一个具有相同名称的变量在同一作用域中声明一个变量: 语法错误,无法编译。但是,如果我们将其放入循环中: 不产生错误,效果很好。我们基本上是在声明相同的变量。是什么原因?在此背后我不知道/不了解的逻辑是什么? 问题答案: 考虑一下这种方式,在每个循环之后,作用域被“破坏”,变量消失了。在下一个循环中,将创建一个新的作用域,并且可以在该作用域中再次声明该变量。 由

  • let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 const是对let的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替v

  • 问题内容: 我偶然发现了一个奇怪的问题,下面的代码无法编译: 错误(代码是linter推荐的代码)。: 注意,确实使用了该变量。 但是,如果我添加了else块-一切都会按预期编译: 这看起来像是编译器中的错误,还是一个已知问题?任何想法?(我正在使用go 1.11) 编辑:到目前为止的所有被告。按照:https : //golang.org/ref/spec#Short_variable_decl

  • 问题内容: 我不明白这个脚本有什么问题 我希望它在表中插入10个值,但是第二行有错误。 问题答案: MySQL不支持执行存储过程代码的匿名块。 您需要创建一个包含该代码的存储过程,然后调用它。 另外,您在插入语句的末尾缺少分号。我修好了 您可能还想使用concat()而不是+来生成名称,但是我将把更改留给您。 创建过程: 调用过程:

  • 主要内容:类型断言(Type Assertion),类型推断,变量作用域变量是一种使用方便的占位符,用于引用计算机内存地址。 我们可以把变量看做存储数据的容器。 TypeScript 变量的命名规则: 变量名称可以包含数字和字母。 除了下划线 _ 和美元 $ 符号外,不能包含其他特殊字符,包括空格。 变量名不能以数字开头。 变量使用前必须先声明,我们可以使用 var 来声明变量。 我们可以使用以下四种方式来声明变量: 声明变量的类型及初始值: 例如: 声明变量的类型,

  • 问题内容: 学习Python,并且有一些基本的疑问。 1.我已经看到变量声明(这里的路径)为 有时,没有显式声明,而是通过进行初始化。 我了解的目的,但建议在其他任何函数中声明变量。 2.如何创建变量以保存自定义类型? 问题答案: 好的,首先是第一件事。 Python中没有“变量声明”或“变量初始化”之类的东西。 我们简单地将其称为“分配”,但可能应该仅将其称为“命名”。 赋值的意思是“现在此名称