3 Go语言的变量声明

本专栏将从基础开始,循序渐进,由浅入深讲解Go语言,希望大家都能够从中有所收获,也请大家多多支持。
查看相关资料与知识库
专栏地址:Go专栏
如果文章知识点有错误的地方,请指正!大家一起学习,一起进步。

文章目录

  • 变量声明
    • 使用 `var` 声明变量
    • 练习 1.02 – 使用 `var` 声明变量
    • 使用 `var` 一次声明多个变量
    • 练习 1.03 – 使用 `var` 一次声明多个变量
    • 跳过声明变量时的类型或值
    • 练习 1.04 – 跳过声明变量时的类型或值
    • 类型推断出错
    • 短变量声明
    • 练习 1.05 – 实现短变量声明
    • 使用短变量声明同时声明多个变量
    • 练习 1.06 – 从函数中声明多个变量
    • 使用 `var` 一行声明多个变量
    • 非英语变量名
    • 修改变量的值
    • 练习 1.07 – 修改变量的值
    • 一行中修改多个变量的值
    • 一次修改多个变量的值
    • 练习 1.08 – 一次修改多个变量的值

变量声明

现在你已经对Go语言有了初步了解并完成了第一个练习,我们将深入探讨变量。我们的第一个重点是变量的声明。

变量用来暂时存储数据,以便你可以对其进行操作。当你声明一个变量时,你需要四个要素:声明变量的语句、变量的名称、变量能够存储的数据类型以及它的初始值。幸运的是,其中一些部分是可选的,这也意味着有多种方式来定义变量。

让我们详细了解所有声明变量的方法。

使用 var 声明变量

使用 var 是声明变量的基础方式。我们将要介绍的其他方法通常是这种方式的变体,通常通过省略一些部分来实现。一个完整的 var 声明如下:

var foo string = "bar"

其中关键部分包括 varfoostring= “bar”

  • var 表示我们正在定义一个变量。
  • foo 是变量的名称。
  • string 是变量的类型。
  • = “bar” 是变量的初始值。

练习 1.02 – 使用 var 声明变量

在这个练习中,我们将使用完整的 var 语法声明两个变量,并将它们打印到控制台。你将看到 var 语法可以在代码的任何地方使用,这并不是所有变量声明语法都能做到的。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 添加所需的导入:

    import ("fmt"
    )
    
  4. 在包级作用域声明一个变量。我们将在后续详细讨论作用域:

    var foo string = "bar"
    
  5. 创建 main() 函数:

    func main() {
    
  6. 在函数内部使用 var 声明另一个变量:

      var baz string = "qux"
    
  7. 将两个变量打印到控制台:

      fmt.Println(foo, baz)
    
  8. 关闭 main() 函数:

    }
    
  9. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

预期输出结果如下:

bar qux

在这个例子中,foo 在包级别声明,而 baz 在函数级别声明。变量声明的位置很重要,因为声明变量的位置也限制了你可以使用的声明语法。

接下来,我们将看另一种使用 var 语法的方式。

使用 var 一次声明多个变量

我们可以使用一个 var 声明来定义多个变量,这可以通过 var 块或语句来实现。这种方法在声明包级变量时非常常见。变量不需要是相同的类型,并且它们可以有各自的初始值。语法如下:

var (<name1> <type1> = <value1><name2> <type2> = <value2><nameN> <typeN> = <valueN>
)

你可以有多个这种类型的声明。这是一种很好的组织相关变量的方式,使你的代码更具可读性。尽管你可以在函数中使用这种语法,但在函数中看到这种用法的情况比较少见。

练习 1.03 – 使用 var 一次声明多个变量

在这个练习中,我们将使用一个 var 语句声明多个变量,每个变量有不同的类型和初始值。然后,我们将打印每个变量的值到控制台。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 添加所需的导入:

    import ("fmt""time"
    )
    
  4. 开始 var 声明:

    var (
    
  5. 定义三个变量:

      Debug   bool   = falseLogLevel  string  = "info"startUpTime time.Time = time.Now()
    
  6. 结束 var 声明:

    )
    
  7. main() 函数中,将每个变量打印到控制台:

    func main() {fmt.Println(Debug, LogLevel, startUpTime)
    }
    
  8. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

在这个练习中,我们使用一个 var 语句声明了三个变量。你的输出结果可能会有所不同,特别是 time.Time 变量的值会随着时间而不同,但格式是相同的。

像这样使用 var 语法是一种很好的方法来保持代码的良好组织,同时也减少了输入量。

接下来,我们将开始去掉 var 语法中的一些可选部分。

跳过声明变量时的类型或值

在实际编码中,使用完整的 var 语法并不常见。通常只有在你需要定义一个具有初始值并且需要严格控制其类型的包级变量时,才会使用完整的语法。到那时,你会明显感受到类型不匹配的问题,所以现在不必太担心。其他时候,你可以省略一些可选部分,或者使用简短的变量声明方式。

在声明变量时,你不必同时包含类型和初始值。你可以只使用其中之一;Go 会处理剩下的部分。如果声明中有类型但没有初始值,Go 会使用该类型的零值。关于零值,我们将在后面章节详细讨论。另一方面,如果有初始值而没有类型,Go 会根据你使用的字面量值来推断所需的类型。

练习 1.04 – 跳过声明变量时的类型或值

在这个练习中,我们将更新之前的练习,使其跳过变量声明中的可选初始值或类型声明。然后,我们将像之前一样将这些值打印到控制台,以展示结果是一致的。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 导入我们需要的包:

    import ("fmt""time"
    )
    
  4. 开始多变量声明:

    var (
    
  5. 在第一次练习中,布尔值的初始值是 false,这是布尔类型的零值,因此我们可以省略其声明中的初始值:

      Debug   bool
    
  6. 其余两个变量都有非零的初始值,因此我们可以省略其类型声明:

      LogLevel  = "info"startUpTime = time.Now()
    
  7. 结束 var 声明:

    )
    
  8. main() 函数中,打印每个变量的值:

    func main() {fmt.Println(Debug, LogLevel, startUpTime)
    }
    
  9. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

    输出显示即使在声明变量时没有提及类型,变量的值仍然正确

在这个练习中,我们能够更新之前的代码,使用更紧凑的变量声明方式。声明变量是你在编程中经常需要做的事情,省略这些冗余部分能让你的编码体验更好。

接下来,我们将探讨一种不能跳过任何部分的情况。

类型推断出错

有时你需要使用声明的所有部分——例如,当 Go 无法推断出你需要的正确类型时。以下是一个示例:

package main
import "math/rand"func main() {var seed = 1234456789rand.NewSource(seed)
}

执行以上代码会出现错误。

问题在于 rand.NewSource 需要一个 int64 类型的变量。Go 的类型推断规则会将像我们使用的数字解释为 int 类型。后续章节中,我们会详细讨论 intint64 的区别。为了解决这个问题,我们需要在声明中明确指定 int64 类型,如下所示:

package main
import "math/rand"func main() {var seed int64 = 1234456789rand.NewSource(seed)
}

接下来,我们将介绍一种更快捷的变量声明方式。

短变量声明

在函数内部声明变量时,我们可以使用 := 简写。这种简写方式允许我们使声明更加简洁。它通过省略 var 关键字,并总是从需要的初始值中推断出类型来实现这一点。

练习 1.05 – 实现短变量声明

在这个练习中,我们将更新之前的代码,使用短变量声明的方式。由于短变量声明只能在函数内使用,我们会将变量从包级别作用域移动到函数内。之前 Debug 变量有类型但没有初始值,现在我们将它更改为具有初始值,因为在使用短变量声明时这是必需的。最后,我们将打印这些变量到控制台。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 导入我们需要的包:

    import ("fmt""time"
    )
    
  4. 创建 main() 函数:

    func main() {
    
  5. 使用短变量声明语法声明每个变量:

      Debug := falseLogLevel := "info"startUpTime := time.Now()
    
  6. 将变量打印到控制台:

      fmt.Println(Debug, LogLevel, startUpTime)
    }
    
  7. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

在这个练习中,我们将之前的代码更新为使用非常简洁的变量声明方式,只要有初始值即可。

:= 简写在 Go 开发者中非常受欢迎,它是现实世界 Go 代码中最常见的变量定义方式。开发者喜欢它使代码简洁紧凑,同时仍然清晰明了。

另一个快捷方式是将多个变量声明在同一行。

使用短变量声明同时声明多个变量

你可以使用短变量声明同时声明多个变量。它们必须都在同一行,并且每个变量都必须有对应的初始值。其语法形式为 , , …, := , , …, 。变量名位于 := 左侧,并用 , 分隔。初始值位于 := 右侧,也用 , 分隔。左侧的第一个变量名对应右侧的第一个值。变量名和初始值的数量必须相等。

以下是一个使用之前练习代码的示例:

package mainimport ("fmt""time"
)func main() {Debug, LogLevel, startUpTime := false, "info", time.Now()fmt.Println(Debug, LogLevel, startUpTime)
}

在实际代码中,有时会看到这样的写法。虽然这种写法有点难以阅读,但它在处理函数返回多个值时非常常见。我们将在后续章节中详细讨论这一点。

练习 1.06 – 从函数中声明多个变量

在这个练习中,我们将调用一个返回多个值的函数,并将每个值赋给一个新变量。然后,我们将这些变量打印到控制台。开始吧:

  1. 创建一个新文件夹,并在其中添加一个名为 main.go 的文件。

  2. main.go 文件的顶部添加 main 包名:

    package main
    
  3. 导入我们需要的包:

    import ("fmt""time"
    )
    
  4. 创建一个返回三个值的函数:

    func getConfig() (bool, string, time.Time) {
    
  5. 在函数中返回三个字面量值,每个值用 , 分隔:

      return false, "info", time.Now()
    
  6. 关闭函数:

    }
    
  7. 创建 main() 函数:

    func main() {
    
  8. 使用短变量声明捕获函数返回的三个新变量的值:

      Debug, LogLevel, startUpTime := getConfig()
    
  9. 将这三个变量打印到控制台:

      fmt.Println(Debug, LogLevel, startUpTime)
    
  10. 关闭 main() 函数:

    }
    
  11. 保存文件。然后,在新文件夹中运行以下命令:

    go run .
    

在这个练习中,我们调用了一个返回多个值的函数,并使用短变量声明在一行中捕获了这些值。如果使用 var 语法,它将如下所示:

var (Debug boolLogLevel stringstartUpTime time.Time
)
Debug, LogLevel, startUpTime = getConfig()

短变量声明是一种使 Go 看起来像动态语言的关键特性。

不过,var 语法还有一个有用的技巧,我们将在接下来的内容中继续探索。

使用 var 一行声明多个变量

虽然短变量声明更常用,但你也可以使用 var 在一行中定义多个变量。需要注意的是,当声明类型时,所有的值必须具有相同的类型。如果你使用初始值,那么每个值可以根据字面量值推断其类型,因此可以有不同的类型。以下是一个示例:

package mainimport ("fmt""time"
)func getConfig() (bool, string, time.Time) {return false, "info", time.Now()
}func main() {// 仅声明类型var start, middle, end float32fmt.Println(start, middle, end)// 初始值,混合类型var name, left, right, top, bottom = "one", 1, 1.5, 2, 2.5fmt.Println(name, left, right, top, bottom)// 也适用于函数var Debug, LogLevel, startUpTime = getConfig()fmt.Println(Debug, LogLevel, startUpTime)
}

在实际应用中,短变量声明通常会更简洁,因此 var 语法不常用于多个变量的声明。唯一的例外是当你需要声明多个相同类型的变量时,这种语法可以帮助你更好地控制类型。

非英语变量名

Go 是一个支持 UTF-8 的语言,这意味着你可以使用除拉丁字母外的其他字母来定义变量名。例如,以下代码展示了如何使用不同语言的字母作为变量名:

package mainimport ("fmt""time"
)func main() {デバッグ := false日志级别 := "info"ይጀምሩ := time.Now()_A1_Μείγμα := "" fmt.Println(デバッグ, 日志级别, ይጀምሩ, _A1_Μείγμα)
}

虽然可以这样定义,但是不建议。

修改变量的值

现在我们已经定义了变量,接下来让我们看看如何修改变量的值。修改变量的值与设置初始值的语法类似,使用 = 这样的格式。

练习 1.07 – 修改变量的值

请按照以下步骤操作:

  1. 创建一个新的文件夹,并在其中添加一个 main.go 文件。

  2. main.go 中,添加 main 包名到文件的顶部:

    package main
    
  3. 导入所需的包:

    import "fmt"
    
  4. 创建 main() 函数:

    func main() {
    
  5. 声明一个变量:

      offset := 5
    
  6. 打印变量的值到控制台:

      fmt.Println(offset)
    
  7. 修改变量的值:

      offset = 10
    
  8. 再次打印变量的值,并关闭 main() 函数:

      fmt.Println(offset)
    }
    
  9. 保存文件。在新的文件夹中,运行以下命令:

    go run .
    

输出结果如下:

5
10

在这个例子中,我们将 offset 的值从初始值 5 修改为 10。任何使用原始值的地方,例如我们示例中的 510,你都可以使用变量。以下是如何使用变量替代原始值的示例:

package mainimport "fmt"var defaultOffset = 10func main() {offset := defaultOffsetfmt.Println(offset)offset = offset + defaultOffsetfmt.Println(offset)
}

输出结果如下:

10
20

在这个例子中,我们将 offset 的初始值设为 defaultOffset,然后将 offset 更新为 offset + defaultOffset。这种方法使得我们可以在代码中使用变量来替代硬编码的值,提高了代码的灵活性和可维护性。

一行中修改多个变量的值

接下来,我们将看看如何在一行中修改多个变量的值。

一次修改多个变量的值

与在一行中声明多个变量类似,你也可以在一行中同时修改多个变量的值。其语法也非常类似,格式为 , , …, = , , …,

练习 1.08 – 一次修改多个变量的值

在本练习中,我们将定义一些变量,并使用一行语句来修改它们的值。然后,我们会打印出这些变量的新值。让我们开始吧:

  1. 创建一个新的文件夹,并在其中添加一个 main.go 文件。

  2. main.go 中,添加 main 包名到文件的顶部:

    package main
    
  3. 导入所需的包:

    import "fmt"
    
  4. 创建 main() 函数:

    func main() {
    
  5. 声明我们的变量并初始化值:

      query, limit, offset := "bat", 10, 0
    
  6. 使用一行语句修改每个变量的值:

      query, limit, offset = "ball", offset, 20
    
  7. 打印这些变量的值到控制台,并关闭 main() 函数:

      fmt.Println(query, limit, offset)
    }
    
  8. 保存文件。在新的文件夹中,运行以下命令:

    go run .
    

输出结果如下,显示了一行语句中修改后的变量值:

ball 0 20

在本练习中,我们成功地在一行中修改了多个变量的值。这种方法也可以用于函数调用,就像变量声明一样。不过,你需要小心使用这种特性,确保代码首先易于阅读和理解。如果使用一行语句使得代码难以理解,那么分多行写代码可能会更清晰。

接下来,我们将探讨操作符是什么,以及它们如何被用来以有趣的方式改变你的变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习3——自学习梳理

1.学习一下盒子模型(盒子就是元素&#xff0c;标签) 盒子模型又分为4种&#xff1a;块级&#xff0c;内联级&#xff0c;内联块级&#xff0c;弹性盒子 (弹性盒子续在下一节) 2.元素的结构 1.盒子模型 <!DOCTYPE html> <html lang"en"> <head>&l…

【嵌入式开发 Linux 常用命令系列 7.7 -- find 和 sed 配合使用介绍】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 使用背景注意事项使用示例 使用背景 当时想在 linux 环境下 使用 find 命令找到 .c 和 .h 文件&#xff0c;并使用xargs 加 sed 命令将文件中所有"demo" 字符串替换为 “hello” 命令实现&#xff1a; 使用 find 命…

【C++杂货铺】智能指针

目录 &#x1f308; 前言&#x1f308; &#x1f4c1; 内存泄漏 &#x1f4c2; 概念 &#x1f4c2; 分类 &#x1f4c2; 如何避免 &#x1f4c1; RAII &#x1f4c1; C11智能指针 &#x1f4c2; auto_ptr &#x1f4c2; unique_ptr &#x1f4c2; shared_ptr &#x1…

电子电器架构 --- 智能汽车的大脑(域控制器)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

QT--进程

一、进程QProcess QProcess 用于启动和控制外部进程&#xff0c;管理其输入输出流。 使用方法 start()&#xff1a;启动一个新进程。setStandardInputFile()&#xff1a;将文件作为标准输入。将进程的标准输入&#xff08;stdin&#xff09;重定向到指定的文件。换句话说&am…

AV1技术学习:Constrained Directional Enhancement Filter

CDEF允许编解码器沿某些(可能是倾斜的)方向应用非线性消阶滤波器。它以88为单位进行。如下图所示&#xff0c;通过旋转和反射所示的三个模板来定义八个预设方向。 Templates of preset directions and their associated directions. The templates correspond to directions of…

筑牢数字防线:从微软蓝屏事件看网络安全与系统韧性建设

引言 近期&#xff0c;由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅给全球用户带来了前所未有的挑战&#xff0c;也深刻暴露了当前IT基础设施在面对潜在威胁时的脆弱性。此次事件&#xff0c;如同一面镜子&#xff0c;映照出我们在网络安全与系统稳定…

MATLAB: ode45 求解常微分方程

引入 ode45 是 MATLAB 中用于求解非刚性常微分方程&#xff08;ODE&#xff09;的数值方法。它基于 Runge-Kutta 方法&#xff0c;并具有自适应步长调整机制&#xff0c;能够在一定误差控制范围内高效地计算 ODE 的数值解。 下面我们通过这个包含详细注释的代码&#xff0c;一…

Windows 11 系统对磁盘进行分区保姆级教程

Windows 11磁盘分区 磁盘分区是将硬盘驱动器划分为多个逻辑部分的过程&#xff0c;每个逻辑部分都可以独立使用和管理。在Windows 11操作系统中进行磁盘分区主要有以下几个作用和意义&#xff1a; 组织和管理数据&#xff1a;分区可以帮助用户更好地组织他们的数据&#xff0c…

无人机之降落操作及紧急情况处理

一、无人机降落操作 1、选择降落地点 a.提前选择一个平坦且没有障碍物的降落点&#xff1b; b.确认降落点周围没有行人或障碍物&#xff0c;保证降落的安全性。 2、降低飞行高度 a.缓慢降低飞行高度&#xff0c;尽量保持匀速下降&#xff0c;防止因下降过快导致无人机受损…

学习vue第一天

文章目录 1.什么是 Vue?2.渐进式框架3.如何新建一个vue项目 1.什么是 Vue? Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0…

Day20 | 39. 组合总和 40.组合总和II 131.分割回文串

语言 Java 39. 组合总和 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidate…

最新可用度盘不限速后台系统源码_去授权开心版

某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp直接访问安装就行 …

探索WebKit的CSS表格布局:打造灵活的网页数据展示

探索WebKit的CSS表格布局&#xff1a;打造灵活的网页数据展示 CSS表格布局是一种在网页上展示数据的强大方式&#xff0c;它允许开发者使用CSS来创建类似于传统HTML表格的布局。WebKit作为许多流行浏览器的渲染引擎&#xff0c;提供了对CSS表格布局的全面支持。本文将深入探讨…

qt 如何制作动态库插件

首先 首先第一点要确定我们的接口是固定的&#xff0c;也就是要确定 #ifndef RTSPPLUGIN_H #define RTSPPLUGIN_H #include "rtspplugin_global.h" typedef void (*func_callback)(uint8_t* data,int len,uint32_t ssrc,uint32_t ts,const char* ipfrom,uint16_t f…

【前端学习笔记】CSS基础一

一、什么是CSS 1.CSS 介绍 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用来控制网页布局和设计外观的样式语言。它使得开发者可以分离网页的内容&#xff08;HTML&#xff09;和表现形式&#xff08;样式&#xff09;&#xff0c;提高了…

Spring Security 介绍

1.概要 Spring Security是一个用于在Java应用程序中实现身份验证和访问控制的强大框架。它可以轻松地集成到任何基于Spring的应用程序中&#xff0c;提供了一套丰富的功能来保护应用程序的安全性。 https://spring.io/projects/spring-security/ demo:https://docs.spring.i…

unity2D游戏开发02添加组件移动玩家

添加组件 给PlayGame和EnemyObject添加组件BoxCollider 2D碰撞器&#xff0c;不用修改参数 给PlayGame添加组件Rigibody 2D 设置数据 添加EnemyObject&#xff0c;属性如下 Edit->project setting->Physics 2D 将 y的值改为0 给playerObject添加标签 新建层 将PlayerObj…

美团后端二面

美团后端二面 ……………………………… 两道场景 一道 数字转中文读法&#xff08;1000-》一千&#xff09; 0八股0自我介绍 反问 “您觉得我能过吗&#xff1f;” “这个需要横行对比之后才能有结果” ……………………………… 什么时候到岗 场景题 1 假设我有一个…

ETL工程师角度下的SQL优化

作为ETL&#xff08;Extract, Transform, Load&#xff09;工程师&#xff0c;SQL优化是提高数据处理和分析效率的关键一环。优化SQL查询可以显著降低数据处理时间&#xff0c;提高ETL过程的性能。本文将从 合理设计数据模型&#xff1a;在ETL过程中&#xff0c;正确的数据模型…