Golang中var关键字的常见问题解析

Golang中var关键字的常见问题解析 首先,老师指出var是一个关键字。我很高兴,因为我终于在语言规范的"变量声明"部分找到了长期寻找但之前未能成功找到的关于这个关键字的信息。这个词对我来说一直是个谜。

VarDecl     = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .
VarSpec     = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
var i int

之前,我以为当语言规范中写出像"("、";"、")“这样的符号时,这些符号必须是表达式的一部分。但我看到在"var i int"中并没有这些符号。那么”("、";"、")"的目的是什么?

var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2
var (
    i       int
    u, v, s = 2.0, 3.0, "bar"
)
var re, im = complexSqrt(-1)
var _, found = entries[name]  // map查找;只关心"found"

这些是否都是var关键字的可能用法?它们是否涵盖了所有可能的用法?

否则,每个变量都会被初始化为其零值

零值的目的是什么?包含它的目的是什么?

有趣的是,老师在他的视频中刚刚说了些话。"如果你需要在函数体外部声明变量,就使用var。“这非常有帮助。为什么我以前没听说过这个?只是在这里"大声思考”。有什么评论吗?

有趣的是学习的过程,至少对我来说是这样。第一次听到关于编程的内容时,听起来像是复杂的胡言乱语,让我难以理解。但随着时间的推移、努力和耐心,理解就会到来。

另外,当我在看视频时,我经常需要暂停视频让信息沉淀,或者需要返回重复观看。我觉得在课堂环境中我会迷失方向。

老师快速浏览了语言规范中关于"零值"的信息。我对这里提供的信息有一个模糊的理解,但我仍然不明白包含零值的目的。

他只是快速提到var关键字可以在包内的任何地方使用。

https://play.golang.org/p/jW-10tKtrrr中,什么被称为"包"?是整个东西?还是整个"程序"?

我已经超出了分配的时间。


更多关于Golang中var关键字的常见问题解析的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

抱歉我错误地使用了```。不知道这是怎么发生的。

更多关于Golang中var关键字的常见问题解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢!!!

var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2
var (
i int
u, v, s = 2.0, 3.0, "bar"
)
var re, im = complexSqrt(-1)
var _, found = entries[name] // map lookup; only interested in "found"

这些是var的使用示例吗?还是var只能通过这些方式使用?

零值的目的是什么?如果它只表示0,那么包含它有什么意义?

cherilexvold1974:

VarDecl = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .

这意味着:

VarDecl 必须以字面量标记 var 开头。其后必须跟随单个 VarSpec 用括号括起来的分号分隔的 VarSpec 列表。

所以你是对的。"("")" 要求你书写字面括号,但还有一个竖线符号(|),表示备选项(在语法中有时称为选择

在Go语言中,var关键字用于声明变量,支持多种声明方式,包括单个变量、多个变量、分组声明以及初始化赋值。以下是对您问题的详细解析和示例代码。

1. var关键字的语法和用法

根据语言规范,var的语法结构允许灵活声明变量:

  • 单个变量:var identifier type
  • 多个变量:var identifier1, identifier2 type
  • 带初始值:var identifier = expressionvar identifier type = expression
  • 分组声明:使用括号()和分号;(在分组中可选)声明多个变量。

示例代码:

package main

import "fmt"

// 包级变量声明
var i int                    // 单个变量,初始化为零值
var U, V, W float64          // 多个同类型变量
var k = 0                    // 类型推断为int
var x, y float32 = -1, -2    // 多个变量带初始值
var (                        // 分组声明
    a       int
    b, c, d = 3.0, 4.0, "foo"
)
var _, found = entries()     // 忽略第一个返回值

func entries() (int, bool) {
    return 42, true
}

func main() {
    fmt.Println(i, U, V, W, k, x, y, a, b, c, d, found)
}

输出:

0 0 0 0 0 -1 -2 0 3 4 foo true

分组声明中的();是语法部分,用于将多个变量声明组织在一起,提高代码可读性。在单个声明中不需要这些符号。

2. 零值的目的

在Go中,所有变量在声明时都会被初始化为其类型的零值,确保变量始终有定义状态,避免未初始化错误。零值根据类型不同:

  • 数值类型:0
  • 布尔类型:false
  • 字符串:""
  • 指针、接口、切片等:nil

示例:

package main

import "fmt"

var num int       // 零值 0
var flag bool     // 零值 false
var str string    // 零值 ""
var slice []int   // 零值 nil

func main() {
    fmt.Printf("num: %d, flag: %t, str: '%s', slice: %v\n", num, flag, str, slice)
    if slice == nil {
        fmt.Println("slice is nil")
    }
}

输出:

num: 0, flag: false, str: '', slice: []
slice is nil

零值机制简化了代码,无需显式初始化即可安全使用变量。

3. var在函数体外部的使用

var关键字可以在包级别(函数外部)声明变量,因为包级变量需要显式声明。函数内部可以使用短声明:=,但短声明仅限函数内。

示例:

package main

import "fmt"

// 包级变量必须使用var
var globalVar int = 10

func main() {
    // 函数内部可使用短声明
    localVar := 20
    fmt.Println(globalVar, localVar)
}

4. 包的定义

在Go中,包(package)是代码组织单元,每个Go文件属于一个包。整个程序由一个main包和可能的其他包组成。在您提供的playground链接中,整个代码属于main包,构成一个可执行程序。

示例:

// 文件: main.go
package main  // 声明包名为main

import "fmt"

var pkgVar = "包级变量"

func main() {
    fmt.Println(pkgVar)
}

包可以包含变量、函数、类型等声明,通过导入机制复用。

以上示例覆盖了var关键字的常见用法,包括分组声明、零值初始化和包级作用域。这些是Go变量声明的标准方式。

回到顶部