Go 语言编程 — 变量与常量
目录
文章目录
- 目录
- 值语义和引用语义
- 变量(var)
- 变量声明:显式指定数据类型
- 变量声明与定义:根据初始化数值自动判定数据类型
- 变量声明与定义:短声明,使用 := 海象运算符
- 同时声明多个变量
- 常量(const)
- 使用 iota 常量来实现 “枚举类型”
值语义和引用语义
在 C 语言中,所有变量都是值语义的。变量名所指向的内存位置,就是变量值所储存的地方。指针变量亦如此,指针变量名所指向的内存位置,就是储存指针变量值(一个内存地址)的地方。
在 Python 中,所有变量都是引用语义的。变量名所指向的内存位置所存储的内容,实际上是变量值在内存中的地址。
而 Golang 则显式的值语义和引用语义都引入了程序设计中,布尔型、数字类型、字符串类型都属于值语义,变量名指向变量值。当使用 = 赋值运算符将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将变量 i 的数值进行了拷贝:
而 Golang 中更复杂的数据类型通常使用引用语义。一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址,或内存地址中的首地址。当使用赋值语句 r2 = r1 时,只有引用(地址)被复制,如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响:
变量(var)
Golang 使用关键字 var 来声明一个变量。格式如下:
var identifier type
也可以一次声明多个变量,称为 “并行赋值”,也可用于接受多返回值函数的返回值:
var identifier1, identifier2 type
声明全局变量:
// 这种因式分解关键字的写法一般用于声明全局变量
var (identifier1 typeidentifier2 type
)
注意:
- 不可以在同一个代码块中重复声明一个同名变量。
- 在函数块中,不可以仅声明,但不可以一个变量。
- 全局变量是可以仅声明,而不使用的。
- 并行赋值时,可以在赋值运算符的左侧使用空白标识符 “_”,表示抛弃值,常用接受多返回值的函数调用,进行对齐补位。空白标识符的本质是一个只写(wo)变量,你不能得到它的值。这样做是因为 Golang 中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数返回中得到的所有返回值。
变量声明:显式指定数据类型
与 C 语言一般,可以在一条语句中完成变量的声明、定义以及初始化。如果没有初始化,则变量默认为零值。
示例:
package mainimport "fmt"func main() {var num intfmt.Println(num)var name string = "fanguiju"fmt.Println(name)
}
注意,不同数据类型的零值亦不相同。例如:布尔类型的零值为 false,数值类型的零值为 0,字符串的零值为空(""),以下几种类型为 nil:
var a *int // 声明指针变量
var a []int // 声明数组变量
var a map[string]int // 声明 Map 变量
var a chan int // 声明 channel 变量
var a func(string) int // 声明函数变量,类型为 func(string)
var a error // 声明 error 接口变量
变量声明与定义:根据初始化数值自动判定数据类型
示例:
package mainimport "fmt"func main() {// var a bool = truevar b = truefmt.Println(b)
}
变量声明与定义:短声明,使用 := 海象运算符
上述可知,Golang 支持在初始化变量的时候省略显式书写数据类型。基于这样的前提,声明语句写上 var 关键字就显得有些多余了。所以,Golang 可以使用 := 赋值运算符来省略书写 var 关键字和数据类型的预定义标识符,是一种简易的写法,通过初始化的数值来确定变量的数据类型。
注意,:= 运算法的简短形式只能在函数中使用,否则编译错误。
示例:
package mainimport "fmt"func main() {f := "fanguiju" // 相对于:var f string = "fanguiju"fmt.Println(f)
}
但需要注意的是,:= 运算符的左值必须是新声明的变量。不能使用 := 来为已经声明或定义过的变量进行赋值,会导致编译错误。
var intVal int
intVal := 1 // 编译错误
同时声明多个变量
例如:
var vname1, vname2, vname3 string = "A", "B", "C"
// or
var vname1, vname2, vname3 = "A", "B", "C"
// or
vname1, vname2, vname3 := "A", "B", "C"
常量(const)
Golang 中使用 const 关键字来声明常量,常量的数据类型只可以是:布尔类型、数字类型和字符串类型。
声明格式:
const identifier type = value
与变量声明类似的,可以省略显式书写数据类型:
const b = "abc"
也可以进行并行赋值:
const c_name1, c_name2 = value1, value2
注意,定义常量不能使用 := 运算符。
Golang 内置的标准函数中:len()、cap()、unsafe.Sizeof() 返回的都是一个常量,所以应该直接赋值与一个常量:
package mainimport ("fmt""unsafe"
)// 批量声明定义常量对象
const (a = "abc"b = len(a)c = unsafe.Sizeof(a)
)func main() {fmt.Println(a, b, c)
}
结果:
abc 3 16
使用 iota 常量来实现 “枚举类型”
Golang 原生不具备 C 语言中的枚举类型关键字 enum,但可以使用 const 关键字和 iota 常量来实现。
通常的,使用因式分解的方式声明多个常量时,后一个常量成员会继承前一个常量成员的数值(若前一个成员有初始化,后一个成员没有初始化的情况下),如下:
package mainimport "fmt"const (Unknown = 1FemaleMale
)func main() {fmt.Println(Unknown, Female, Male)
}
结果:
1 1 1
iota(希腊字母艾欧他,对应拉丁字母 i)表示下标,是一个特殊的常量,其数值可以被编译器所修改。iota 结合上述的 const 隐性重复最后一个非空表达式的语法糖,可以用于递增场景(常量生成器)。
iota 在 const 关键字出现时会被重置为 0,批量创建常量时,在同一 “批” 中,每新增一行常量声明,就会使 iota 计数一次。所以,iota 的本质可理解为 const 语句块中的行索引。
package mainimport "fmt"const (a = iotab = iotac = iota
)
/* 也可以简写为如下形式:** const (* a = iota* b* c* )*/func main() {fmt.Println(a, b, c)
}
结果:
0 1 2
示例:
package mainimport "fmt"const (a = iota // 0b // 1c // 2d = "ha" // 独立值,iota += 1e // 继承上一个值,iota += 1f = 100 // 独立值,iota +=1g // 继承上一个值,iota +=1h = iota // 7(恢复计数)i // 8
)func main() {fmt.Println(a, b, c, d, e, f, g, h, i)
}
运行结果:
0 1 2 ha ha 100 100 7 8
再看个有趣的的 iota 示例:
package mainimport "fmt"
const (i = 1 << iota // 位左移运算符 1 位j = 3 << iota // 位左移运算符 2 位k // 位左移运算符 3 位l // 位左移运算符 4 位
)func main() {fmt.Println("i=", i)fmt.Println("j=", j)fmt.Println("k=", k)fmt.Println("l=", l)
}
结果:
i= 1
j= 6
k= 12
l= 24
简单表述:
i = 1 << iota
:iota 为 0,左移 0 位,二进制 001,不变,仍为 1;j = 3 << iota
:iota 为 1,左移 1 位,二进制 110,即 6;k = 3 << iota
:iota 为 2,左移 2 位,二进制 1100,即 12;l = 3 << iota
:iota 为 3,左移 3 位,二进制 11000,即 24。
Go 语言编程 — 变量与常量相关推荐
- C 语言编程 — 变量和常量
目录 文章目录 目录 前文列表 变量与常量 变量 变量的类型 变量的声明 变量的定义 变量的初始化与赋值 常量 整型常量 浮点型常量 字符型场景 字符串常量 符号常量 前文列表 <程序编译流程与 ...
- php常量 变量,php语言的变量和常量
php语言的变量和常量 变量和常量是php语言的一大知识点,下面我们一起来了解关于php语言的变量和常量吧,欢迎大家阅读! php语言的变量和常量 (一)常量 变量可以随时重新赋值 //$age = ...
- 02-Go语言基础变量和常量
标识符与关键字 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名,常量名,函数名等等.Go语言中标识符由字母数字和_组成,并且只能以字母和_开头.举几个例子:abc,_,_123 ...
- c语言生成一串变量,大魔王程序员生成记#02#C语言基础——变量与常量
变量: 变量代表一个具有名字的,具有特定属性的一个存储单元.它用来存放数据,也就是存放变量的值.在程序的运行期间,变量的值是可以改变的. 变量的作用范围:在花括号之间. int main() { in ...
- java中常量和变量的区别_Java语言基础 变量和常量
变量和常量 1.变量的有效范围(作用域) (1)在类体中定义的变量被称为成员变量,成员变量在整个类中都有效.类的成员变量分为静态变量和实例变量,静态变量通过修饰符static确定,并且可以通过&quo ...
- 《零基础看得懂的C语言入门教程 》——(五)C语言的变量、常量及运算
一.学习目标 了解C语言变量的其它创建方式 了解C语言常量 了解C语言的运算符 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言. 第一篇:(一)脱离学习误区 第二篇:(二)C语言没那 ...
- c查看变量类型_C语言的变量、常量及运算
一学习目标 了解C语言变量的其它创建方式 了解C语言常量 了解C语言的运算符 二了解C语言常量上一节中,了解了变量是可以改变存储值的容器,与变量相对的概念则是常量,相对的含义是指可变与不可变.2.1 ...
- 【C语言】变量和常量、数据类型、进制转换、数据存储
目录 1. 变量 1.1 变量的分类 1.1.1 局部变量 1.1.2 全局变量 1.2 变量的使用 1.3 变量的作用域和生命周期 1.3.1 作用域 1.3.2 生命周期 2. 常量 2.1 字面 ...
- c语言的变量,常量及作用域等
1.const定义常量 在C语言中,const可以用来定义的一个常量,在变量名前加上const即可. int const a: 定义了一个a的整数常量,且a的值不能被修改.如果要修改a的值,有以下两种 ...
最新文章
- 中国数学家在微分几何学领域取得重大突破
- 关于 Twing Hot Link 的一些事
- Linux上日志的切割
- 我猜后台管理路径猜解
- linux tcmalloc,内存管理TCMalloc 安装和使用
- Java 调用Dll
- 通过onkeydown事件来控制只允许数字
- XPath学习:轴(4)——ancestor
- 理解linux下的load
- 「题解」:[AHOI2012] 树屋阶梯
- RLC电阻电容电感基础知识——电阻篇
- 北京云栖AI大热 驻云CloudCare揭云服务新趋势
- GIS空间分析之Clip
- 迭代开发中的微服务拆分
- centos虚拟机桥接网络配置服务器,CentOS7虚拟机桥接网络配置
- 孤单还是对你最好的惩罚
- 当点击按钮没有反应时的解决办法
- WER2019上海世界锦标赛
- 关于防火墙的调研报告
- 食堂窗口排长队?社区如何改善老年人用餐问题
热门文章
- 查看java内存_怎么查看java虚拟机存储空间使用情况
- python管道_python中管道用法入门,举个例子
- Science Advances文章揭示长时记忆的神经动态表征机制
- 从EEG中解码想象的3D手臂运动轨迹以控制两个虚拟手臂
- psychopy: pyglet.media.sources.riff.WAVEFormatException: AVbin is required to decode compressed medi
- [评测] 联想 Mirage Solo 一体机:基本性能强大,价格定位很迷
- 一举打败16个同类模型,视频超分比赛冠军算法入选CVPR 2022,来自商汤南洋理工大学...
- 百度要在“元宇宙”里办AI开发者大会了
- 比用Pytorch框架快200倍!0.76秒后,笔记本上的CNN就搞定了MNIST | 开源
- 山景智能创始人黄勇:银行要从数据智能转向业务智能,今天的金融服务难以支撑未来 | MEET2021...