第 4 章 - Go 语言变量与常量

1. 变量声明

在Go语言中,变量声明有多种方式。常见的变量声明方式包括使用 var 关键字、短变量声明和类型推断。

1.1 使用 var 关键字声明变量

这是最传统的方式,适用于显式声明变量的类型。

package mainimport "fmt"func main() {var a int = 10var b string = "Hello, Go!"fmt.Println("a:", a)fmt.Println("b:", b)
}
1.2 短变量声明

短变量声明使用 := 操作符,适用于在函数内部声明变量。编译器会根据赋值表达式的类型自动推断变量的类型。

package mainimport "fmt"func main() {a := 10b := "Hello, Go!"fmt.Println("a:", a)fmt.Println("b:", b)
}
1.3 类型推断

Go语言支持类型推断,即编译器可以根据初始值自动推断变量的类型。这在使用 var 关键字声明变量时也可以实现。

package mainimport "fmt"func main() {var a = 10var b = "Hello, Go!"fmt.Println("a:", a)fmt.Println("b:", b)
}

2. 常量定义

常量在Go语言中使用 const 关键字声明。常量的值在编译时确定,不能在运行时修改。

2.1 声明单个常量
package mainimport "fmt"func main() {const pi float64 = 3.14159const greeting = "Hello, World!"fmt.Println("pi:", pi)fmt.Println("greeting:", greeting)
}
2.2 声明多个常量

可以一次性声明多个常量,使用逗号分隔。

package mainimport "fmt"func main() {const (pi      = 3.14159e       = 2.71828phi     = 1.61803gravity = 9.8)fmt.Println("pi:", pi)fmt.Println("e:", e)fmt.Println("phi:", phi)fmt.Println("gravity:", gravity)
}

3. 类型推断

类型推断是Go语言的一个重要特性,它使得代码更加简洁。编译器会根据初始值自动推断变量的类型。

3.1 简单类型推断
package mainimport "fmt"func main() {a := 10           // intb := "Hello, Go!" // stringc := 3.14         // float64fmt.Println("a:", a)fmt.Println("b:", b)fmt.Println("c:", c)
}
3.2 复合类型推断

Go语言支持复杂的类型推断,例如数组、切片、映射等。

package mainimport "fmt"func main() {arr := [3]int{1, 2, 3}        // 数组slice := []int{1, 2, 3, 4, 5} // 切片map_ := map[string]int{"a": 1, "b": 2} // 映射fmt.Println("Array:", arr)fmt.Println("Slice:", slice)fmt.Println("Map:", map_)
}

4. 综合示例

下面是一个综合示例,展示了变量声明、常量定义和类型推断的多种用法。

package mainimport "fmt"func main() {// 使用 var 关键字声明变量var age int = 30var name string = "Alice"// 短变量声明height := 1.75city := "New York"// 常量定义const pi float64 = 3.14159const greeting = "Hello, World!"// 复合类型推断arr := [3]int{1, 2, 3}slice := []int{1, 2, 3, 4, 5}map_ := map[string]int{"a": 1, "b": 2}// 打印所有变量和常量fmt.Println("age:", age)fmt.Println("name:", name)fmt.Println("height:", height)fmt.Println("city:", city)fmt.Println("pi:", pi)fmt.Println("greeting:", greeting)fmt.Println("Array:", arr)fmt.Println("Slice:", slice)fmt.Println("Map:", map_)
}

5. 总结

通过上述示例,我们详细讲解了Go语言中的变量声明、常量定义和类型推断。这些基本概念是编写Go程序的基础,希望这些内容能帮助你更好地理解和使用Go语言。

当然,我们可以继续深入探讨更多关于变量和常量的高级用法,包括变量的作用域、多变量声明、常量的枚举和 iota 的使用等。下面是一些更详细的示例和解释。

6. 变量的作用域

变量的作用域决定了变量在代码中的可见性和生命周期。Go语言中有几种不同的作用域:

  • 全局变量:在所有函数之外声明的变量,可以在整个包中访问。
  • 局部变量:在函数内部声明的变量,只能在该函数内访问。
  • 块作用域:在 {} 块内声明的变量,只能在该块内访问。
全局变量
package mainimport "fmt"// 全局变量
var globalVar int = 100func main() {fmt.Println("Global variable:", globalVar)
}
局部变量
package mainimport "fmt"func main() {// 局部变量localVar := 200fmt.Println("Local variable:", localVar)
}
块作用域
package mainimport "fmt"func main() {if true {blockVar := 300fmt.Println("Block variable inside if block:", blockVar)}// 下面的代码会报错,因为 blockVar 在 if 块外不可见// fmt.Println("Block variable outside if block:", blockVar)
}

7. 多变量声明

Go语言允许一次声明多个变量,可以使用 var 关键字或短变量声明。

使用 var 关键字声明多个变量
package mainimport "fmt"func main() {var a, b, c int = 1, 2, 3var x, y string = "Hello", "World"fmt.Println("a:", a, "b:", b, "c:", c)fmt.Println("x:", x, "y:", y)
}
使用短变量声明声明多个变量
package mainimport "fmt"func main() {a, b, c := 1, 2, 3x, y := "Hello", "World"fmt.Println("a:", a, "b:", b, "c:", c)fmt.Println("x:", x, "y:", y)
}

8. 常量的枚举和 iota

Go语言中的 iota 是一个特殊的常量生成器,可以用于生成一系列相关的常量值。iota 在每个 const 块中从0开始递增。

枚举常量
package mainimport "fmt"func main() {const (Sunday = iotaMondayTuesdayWednesdayThursdayFridaySaturday)fmt.Println("Sunday:", Sunday)fmt.Println("Monday:", Monday)fmt.Println("Tuesday:", Tuesday)fmt.Println("Wednesday:", Wednesday)fmt.Println("Thursday:", Thursday)fmt.Println("Friday:", Friday)fmt.Println("Saturday:", Saturday)
}
使用 iota 生成二进制标志
package mainimport "fmt"func main() {const (Read  = 1 << iota // 1Write                // 2Execute              // 4All = Read | Write | Execute // 7)fmt.Println("Read:", Read)fmt.Println("Write:", Write)fmt.Println("Execute:", Execute)fmt.Println("All:", All)
}

9. 综合示例

下面是一个综合示例,展示了变量的作用域、多变量声明和常量的枚举及 iota 的使用。

package mainimport "fmt"// 全局变量
var globalVar int = 100func main() {// 局部变量localVar := 200fmt.Println("Global variable:", globalVar)fmt.Println("Local variable:", localVar)// 块作用域if true {blockVar := 300fmt.Println("Block variable inside if block:", blockVar)}// 多变量声明var a, b, c int = 1, 2, 3var x, y string = "Hello", "World"fmt.Println("a:", a, "b:", b, "c:", c)fmt.Println("x:", x, "y:", y)// 使用短变量声明d, e, f := 4, 5, 6z, w := "Hi", "There"fmt.Println("d:", d, "e:", e, "f:", f)fmt.Println("z:", z, "w:", w)// 常量的枚举和 iotaconst (Sunday = iotaMondayTuesdayWednesdayThursdayFridaySaturday)fmt.Println("Sunday:", Sunday)fmt.Println("Monday:", Monday)fmt.Println("Tuesday:", Tuesday)fmt.Println("Wednesday:", Wednesday)fmt.Println("Thursday:", Thursday)fmt.Println("Friday:", Friday)fmt.Println("Saturday:", Saturday)const (Read  = 1 << iota // 1Write                // 2Execute              // 4All = Read | Write | Execute // 7)fmt.Println("Read:", Read)fmt.Println("Write:", Write)fmt.Println("Execute:", Execute)fmt.Println("All:", All)
}

10. 总结

通过上述示例,我们详细讲解了Go语言中的变量作用域、多变量声明、常量的枚举和 iota 的使用。这些高级用法可以帮助你编写更加简洁和高效的Go代码。希望这些内容能帮助你更好地理解和使用Go语言。

11. 变量的初始化

在Go语言中,变量可以在声明时初始化,也可以在声明后初始化。未初始化的变量会被赋予其类型的零值。

11.1 声明时初始化
package mainimport "fmt"func main() {var a int = 10var b string = "Hello, Go!"fmt.Println("a:", a)fmt.Println("b:", b)
}
11.2 声明后初始化
package mainimport "fmt"func main() {var a intvar b stringa = 10b = "Hello, Go!"fmt.Println("a:", a)fmt.Println("b:", b)
}

12. 零值

在Go语言中,未初始化的变量会被赋予其类型的零值。不同类型的零值如下:

  • int, uint, int8, int16, int32, int64, uint8, uint16, uint32, uint64: 0
  • float32, float64: 0.0
  • bool: false
  • string: “”
  • 指针、函数、接口、切片、通道、映射: nil
示例
package mainimport "fmt"func main() {var a intvar b float64var c boolvar d stringvar e *intvar f []intvar g map[string]intvar h chan intfmt.Println("a:", a) // 0fmt.Println("b:", b) // 0.0fmt.Println("c:", c) // falsefmt.Println("d:", d) // ""fmt.Println("e:", e) // nilfmt.Println("f:", f) // nilfmt.Println("g:", g) // nilfmt.Println("h:", h) // nil
}

13. 常量表达式

常量表达式是在编译时计算的,可以包含常量、字面量和某些内置函数(如 lencaprealimagcomplexunsafe.Sizeof 等)。

示例
package mainimport "fmt"func main() {const (a = 10b = a + 5c = len("Hello, Go!")d = unsafe.Sizeof(a) // 需要导入 "unsafe" 包)fmt.Println("a:", a)fmt.Println("b:", b)fmt.Println("c:", c)fmt.Println("d:", d)
}

14. 最佳实践

14.1 使用短变量声明

在函数内部,尽量使用短变量声明 :=,使代码更加简洁。

package mainimport "fmt"func main() {a := 10b := "Hello, Go!"fmt.Println("a:", a)fmt.Println("b:", b)
}
14.2 避免全局变量

尽量避免使用全局变量,因为它们会增加代码的耦合度和复杂性。尽量将变量的作用域限制在需要的地方。

package mainimport "fmt"func main() {// 局部变量localVar := 200fmt.Println("Local variable:", localVar)
}
14.3 使用常量代替魔法数

使用常量代替代码中的“魔法数”(没有明确含义的数字),可以使代码更具可读性和可维护性。

package mainimport "fmt"const (MaxUsers = 100MinAge   = 18
)func main() {users := 95age := 20if users < MaxUsers && age >= MinAge {fmt.Println("User can join the system.")} else {fmt.Println("User cannot join the system.")}
}

15. 综合示例

下面是一个综合示例,展示了变量的初始化、零值、常量表达式和一些最佳实践。

package mainimport ("fmt""unsafe"
)// 全局变量
var globalVar int = 100func main() {// 局部变量localVar := 200fmt.Println("Global variable:", globalVar)fmt.Println("Local variable:", localVar)// 零值var a intvar b float64var c boolvar d stringvar e *intvar f []intvar g map[string]intvar h chan intfmt.Println("a:", a) // 0fmt.Println("b:", b) // 0.0fmt.Println("c:", c) // falsefmt.Println("d:", d) // ""fmt.Println("e:", e) // nilfmt.Println("f:", f) // nilfmt.Println("g:", g) // nilfmt.Println("h:", h) // nil// 常量表达式const (aConst = 10bConst = aConst + 5cConst = len("Hello, Go!")dConst = unsafe.Sizeof(aConst))fmt.Println("aConst:", aConst)fmt.Println("bConst:", bConst)fmt.Println("cConst:", cConst)fmt.Println("dConst:", dConst)// 最佳实践users := 95age := 20const (MaxUsers = 100MinAge   = 18)if users < MaxUsers && age >= MinAge {fmt.Println("User can join the system.")} else {fmt.Println("User cannot join the system.")}
}

16. 总结

通过上述示例,我们详细讲解了Go语言中的变量初始化、零值、常量表达式以及一些最佳实践。这些知识点有助于你编写更加清晰、高效和可维护的Go代码。希望这些内容能帮助你更好地理解和使用Go语言。如果你有任何问题或需要进一步的解释,请随时提问!

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

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

相关文章

Android 开发指南:初学者入门

Android 是全球最受欢迎的移动操作系统之一&#xff0c;为开发者提供了丰富的工具和资源来创建各种类型的应用程序。本文将为你提供一个全面的入门指南&#xff0c;帮助你从零开始学习 Android 开发。 目录 1. 了解 Android 平台[1]2. 设置开发环境[2]3. 学习基础知识[3]4. 创…

漏洞挖掘 | 某医院小程序支付漏洞+越权

漏洞挖掘 | 某医院小程序支付漏洞越权 登陆后点击个人信息&#xff0c;抓包&#xff0c;放到repeter模块 修改strUserID参数可以越权查看别人信息 放intruder模块可以跑数据&#xff0c;这里有几万信息泄露 回到首页&#xff0c;点击医生咨询功能点 随便选一个需要付费的医…

MFC图形函数学习07——画扇形函数

绘制扇形函数是MFC中绘图的基本函数&#xff0c;它绘制的仍是由椭圆弧与椭圆中心连线构成的椭圆扇形&#xff0c;特例是由圆弧与圆心连线构成的圆扇形。 一、绘制扇形函数 原型&#xff1a;BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); …

基于Python的膳食健康系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

头歌网络安全(11.12)

头歌禁止复制解决 必须先下篡改猴&#xff01;&#xff01;&#xff01;&#xff01; 头歌复制助手 Educoder Copy Helperhttps://scriptcat.org/zh-CN/script-show-page/1860 Java生成验证码 第1关&#xff1a;使用Servlet生成验证码 任务描述 本关任务&#xff1a;使用se…

ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析

在安卓14 安卓15的固件中。如果修改了系统级别的app。那么就会触发安卓14 15的应用签名验证。要么会导致修改的固件会进不去系统,或者进入系统有bug。博文将从几方面来解析去除安卓14 15应用签名验证的几种方法。 💝💝💝通过博文了解: 1💝💝💝-----安卓14去除…

第七部分:2. STM32之ADC实验--AD多通道(AD采集三路传感器模块实验:光敏传感器、热敏传感器、反射式传感器附赠温湿度传感器教程)

这个多通道采用非扫描模式--单次转换模式 1.代码配置链路图 2. ADC的输入通道 3.ADC的非扫描模式的转换模式&#xff08;单次和连续&#xff09; 4.ADC的扫描模式的转换模式&#xff08;单次和连续&#xff09; 5.采集校准 代码实验&#xff1a; 代码部分&#xff1a; #inclu…

crond 任务调度 (Linux相关指令:crontab)

相关视频链接 crontab 进行 定时任务 的设置 概述 任务调度&#xff1a;是指系统在某个时间执行的特定的命令或程序 任务调度的分类&#xff1a; 1.系统工作&#xff1a;有些重要的工作必须周而复始地执行。如病毒扫描等。 2.个别用户可能希望执行某些程序&#xff0c;比如…

基于python 的opencv 使用GrabCut算法分割图像代码

#利用grabcut算法分割图像import numpy as np import cv2 from matplotlib import pyplot as plt import warningswarnings.filterwarnings("ignore", module "matplotlib")imgpath E:/code/image_opencv_test/lena.jpg img cv2.imread(imgpath)Coords1x…

AndroidStudio-文本显示

一、设置文本的内容 1.方式&#xff1a; &#xff08;1&#xff09;在XML文件中通过属性&#xff1a;android:text设置文本 例如&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.andr…

css:没错又是我

背景 给元素添加背景样式 还可以设置背景颜色、背景图片&#xff08;教练我要学这个&#xff09;、背景平铺、背景图片位置、背景图像固定 背景颜色 这个我们用过&#xff0c;就是&#xff1a; a {background-color: hotpink; } 一般默认值是transparent&#xff0c;也就…

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹&#xff1f; 如果觉得博主写的还可以&#xff0c;点赞收藏关注噢~ 第一步&#xff1a;拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后&#xff0c;点击按钮创建…

uniapp的基本使用(easycom规范和条件编译)和uview组件的安装和使用

文章目录 1、uniapp1.uview组件安装2.uview-plus组件安装 2、条件编译3、easycom规范1.组件路径符合规范2.自定义easycom配置的示例 总结 1、uniapp UniApp的UI组件库&#xff0c;如TMUI、uViewUI、FirstUI、TuniaoUI、ThorUI等&#xff0c;这些组件库适用于Vue3和TypeScript&…

攻防世界37-unseping-CTFWeb

攻防世界37-unseping-CTFWeb <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("…

【大数据学习 | HBASE高级】region split机制和策略

1. region split机制 ​ HRegionServer拆分region的步骤是&#xff0c;先将该region下线&#xff0c;然后拆分&#xff0c;将其子region加入到hbase:meta表中&#xff0c;再将他们加入到原本的HRegionServer中&#xff0c;最后汇报Master。 split前&#xff1a;hbase:meta表有…

FMC 扩展子卡6 路 422,8 组 LVDS,8 路 GPIO

FMC 扩展子卡6 路 422,8 组 LVDS,8 路 GPIO 卡是一款支持多路 LVCMOS 和 LVDS 信号互转的 FMC 扩展子板。它能支持 6 路 422 信号的输入 / 输出 ,8 组 LVDS 信号的输入 / 输出和 8 路 GPIO 信号的输入 / 输出。本产品基于一些逻辑转换芯片而设计&#xff0c;能实现差分信号转单…

old-cms(原生PHP开发的企业网站管理系统)

old-cms是一个使用原生PHP开发的实用的PHP企业网站管理系统&#xff0c;包括企业网站常用的功能板块&#xff0c;如&#xff1a;产品管理、新闻管理、栏目管理、模板标签管理、分类管理、诚聘英才、在线留言反馈、关于我们&#xff08;公司简介&#xff09;等等&#xff0c;也有…

IPv4与IPv6的优缺点

IPv4 和 IPv6 都是 TCP/IP 协议的版本。IP 是指互联网协议&#xff0c;是传输控制协议/互联网协议套件&#xff08;TCP/IP&#xff09;的主要部分。 TCP/IP 是一套标准和规则&#xff0c;用于规范不同网络上的设备之间打包数据&#xff08;数据报&#xff09;的传输和交换。互…

git命令及原理

git: 目录则被称之为“树” 文件被称作 Blob 对象. git help <command>: 获取 git 命令的帮助信息 git init: 创建一个新的 git 仓库&#xff0c;其数据会存放在一个名为 .git 的目录下 git status: 显示当前的仓库状态 git add <filename>: 添加文件到暂存区 git …

aws xray通过设置采样规则对请求进行过滤

参考资料 https://github.com/aws/aws-xray-sdk-pythonpython api reference&#xff0c;https://docs.aws.amazon.com/xray-sdk-for-python/latest/reference/node api reference&#xff0c;https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/ 初始化环境…