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

短变量声明和“变量已声明且未使用”错误

逑禄
2023-03-14
问题内容

我偶然发现了一个奇怪的问题,下面的代码无法编译:

func main() {
    var val reflect.Value
    var tm time.Time

    if tm, err := time.Parse(time.RFC3339, "2018-09-11T17:50:54.247Z"); err != nil {
        panic(err)
    }
    val = reflect.ValueOf(tm)

    fmt.Println(val, tm, reflect.TypeOf(tm))
}

错误(代码是linter推荐的代码)。:

$ go run main.go
# command-line-arguments
./main.go:13:5: tm declared and not used

注意,tm确实使用了该变量。

但是,如果我添加了else块-一切都会按预期编译:

func main() {
    var val reflect.Value
    var tm time.Time

    if tm, err := time.Parse(time.RFC3339, "2018-09-11T17:50:54.247Z"); err != nil {
        panic(err)
    } else {
        val = reflect.ValueOf(tm)
    }

    fmt.Println(val, tm, reflect.TypeOf(tm))
}

这看起来像是编译器中的错误,还是一个已知问题?任何想法?(我正在使用go 1.11)

编辑:到目前为止的所有被告。按照:https
:
//golang.org/ref/spec#Short_variable_declarations

与常规变量声明不同,短html" target="_blank">变量声明可以重新声明变量,前提是它们最初是在相同类型的同一个块中(如果该块是函数体的话,则在参数列表中)被声明为更早,且类型相同,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新的变量;它只是为原始值分配一个新值。


问题答案:

这部分:

if tm, err := time.Parse(...)

创建一个仅在语句中具有作用域的 变量-不是您声明为的变量。tm``if``var tm time.Time

中没有使用此新变量if,因此会出现错误。请注意,您也没有tm分配外部级别,因此fmt.Println将打印零时间,而不是时间.Parse返回。

要解决此问题:声明err并更改if为:

var err error
if tm, err = time.Parse(...)

注意,这在GO中是一件微妙的事情,并且是常见的错误来源。:=实际上,该语句可以与已经声明的变量和一个或多个 变量混合使用(如果已经声明的变量在
同一词法范围内)
。然后,只有新的才被自动声明,:=其余的才被赋值(与一样=)。但是,如果:=在新作用域中使用,则将在该作用域中声明ALL变量,并屏蔽具有相同名称的任何外部作用域变量(例如在if;中;请注意,该if条件不在括号内,但仍视为如果它在{code}块内;forGO中的和其他复合语句也会发生同样的情况。



 类似资料:
  • 问题内容: 我正在学习Google的新语言Go。我只是在尝试一些东西,我注意到,如果您声明一个变量并且不对其执行任何操作,则go编译器(在我的情况下为 8g )将无法 编译,并显示以下错误:。令我惊讶的是,大多数语言编译器只是 警告 您有关未使用的变量,但仍会编译。 无论如何,我能解决这个问题吗?我检查了编译器的文档,但看不到任何会改变此行为的内容。有没有一种方法可以删除以进行编译? 问题答案:

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

  • 问题内容: 我收到此错误消息,说我没有使用变量……但是在我的菜鸟眼中,看起来我在: 谁能指出我对语言的缺失?我认为这与vs 和作用域有关,但我不确定。 问题答案: 在您的for循环声明了一个新的变量,其阴影外。将其变成平原以解决问题。 顺便说一下,为了获得相同的精度和更快的速度,您可以尝试以下实现,该实现一次执行两个步骤:

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

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

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