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

了解Go中的变量范围

曾光远
2023-03-14
问题内容

我正在Go specification学习语言,这些要点摘自的规范Declarations and scope

虽然我能理解分1-4,我很困惑的点56

5.
在函数内部声明的常量或变量标识符的范围始于ConstSpec或VarSpec的末尾(对于简短变量声明为ShortVarDecl),并在最里面的包含块的末尾结束。
6. 在函数内部声明的类型标识符的范围始于TypeSpec中的标识符,并终止于最里面的包含块的末尾。


这是我用来了解Go范围的代码:

package main

import "fmt"

func main() {
    x := 42
    fmt.Println(x)
    {
        fmt.Println(x)
        y := "The test message"
        fmt.Println(y)
    }
    // fmt.Println(y) // outside scope of y
}

据此,我理解是scope of xmain函数内,并且scope of y在后的开括号和闭括号内fmt.Println(x),并且我不能y在闭括号之外使用。

如果我理解正确,那么两点4 and 5都在说同一件事。所以我的问题是:

  1. 如果他们说的是同一件事,那么importance这两点是什么呢?

  2. 如果它们不同,请让我知道difference吗?


问题答案:

他们用相同的规则针对两个不同的观点提出了相同的观点:第一是关于变量和常量,第二是关于类型标识符。因此,如果您在块内声明类型,则作用域规则与在同一位置声明的变量相同。



 类似资料:
  • 问题内容: 在类中声明变量(在函数外部):所有类函数都可以访问它(基本上是公共变量) 在类内的函数内声明变量:只有该函数才能访问它(在该函数范围内) 在类内的函数内部声明带有self。(变量名)的变量:所有类函数都可以访问它(这与全局变量名有何不同?) 并且由于没有私有/受保护的事物,所以所有事物都是公共的,因此可以从类外部访问所有可以从类内部访问的事物。 我还有其他细微差别应该知道吗? 问题答案

  • 问题内容: 我想通过使用以下代码来获取全局变量中的数据: 但是问题是我只是在d3.json函数中定义了数据变量,但是没有定义。我该如何解决这个问题? 谢谢 问题答案: 由于d3请求(如)是异步的,因此最佳做法是将所有依赖于外部请求的代码包装在请求回调中,以确保该代码在执行之前可以访问数据。来自D3 docs :“异步加载数据时,依赖于已加载数据的代码通常应存在于回调函数中。” 因此,一种选择是将所

  • 本章介绍当模板在访问变量时发生了什么事情,还有变量是如何存储的。 当调用 Template.process 方法时,它会在方法内部创建一个 Environment 对象,在 process 返回之前一直使用。 该对象存储模板执行时的运行状态信息。除了这些,它还存储由模板中指令,如 assign, macro, local 或 global 创建的变量。 它不会尝试修改传递给 process 的数据

  • Go是静态类型语言,变量是有明确类型的。编译器会检查函数调用中,变量类型的正确性。 使用var关键字来定义变量。 Go 的基本类型有: bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // uint8 的别名 rune // int32 的别名 代表一个Unicode码 floa

  • 问题内容: 我正在用Java 构建一个类。逻辑本身可以工作并找到期望的解决方案(带有任意数量的参数)。无论如何,部分项目如我所料。 问题来自解决方案表示的问题。可以公平地说,我已经用Python完成了这个项目,并决定尝试使用Java作为一种介绍,这可能是问题所在,我也想像Python一样这样做。 这是我的一些课程: 问题是它仍然从Operation类获取令牌:“ null” 我知道这可能是因为op

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实