常量是什么?
常量是指在程序运行过程中其值不能改变的量。
Go语言声明常量
类型 | 定义方式 | 不同类型基本运算【算数运算、逻辑运算、比较运算】 |
---|---|---|
有类型常量 | 显示类型定义 const a int = 1 | 不能 |
无类型常量 | 隐式类型定义 const b = 2 | 能 |
在 Go 语言中,常量分为有类型常量和无类型常量
Golang 中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。
错误示例
const a int = 1
const b float64 = 2.2
const c = a<b //不可进行比较运算
正确示例
const a = 1
const b = 2.2
const c = a < b //可进行运算
由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式
常量的定义格式和变量的声明语法类似: const name [type] = value
批量组合声明
const (
e = 2.718
pi = 3.1415926
)
注意:一个常量被声明后可以不使用,但是变量一旦声明则必须使用
Go语言的常量虽然可以是任何基本数据类型,但许多常量并不从属某一具体类型
只有常量可以是无类型的。当一个无类型的常量被赋值给一个变量的时候,或者出现在有明确类型的变量声明的右边,无类型的常量将会被隐式转换为对应的类型
对于常量面值,不同的写法可能会对应不同的类型。例如0、0.0、0i和u0000虽然有着相同的常量值,但是它们分别对应无类型的整数、无类型的浮点数、无类型的复数和无类型的字符等不同的常量类型。同样,true和false也是无类型的布尔类型,字符串面值常量是无类型的字符串类型。
从属类型待定的常量共有6种,分别是无类型布尔、无类型整数、无类型文字符号、无类型浮点数无类型复数、无类型字符串
编译器为这些没有明确基础类型的数字常量提供比基础类型更高精度的算术运算,当赋值给特定迷型时精度会有影响
当你把无类型的常量,赋值给一个变量的时候,无类型的常量会被隐式的转化成对应的类型
常量的地址不能被访问
GO常量注意点
1:常量使用const修饰,代表永远是只读,不能修改,对值进行保护
2: const只能修饰boolean,number(int相关类型、浮点类型、complex) 和string。只能是布尔、整数、浮点、复数和字符串
3:语法: const identifier [type]= value,其中type可以省略。(无类型 有类型)
所有常量的运算都可以在编译期完成,这样不仅可以减少运行时的工作,也方便其他代码的编译优化,当操作数是常量时,一些运行时的错误也可以在编译时被发现,例如整数除零、字符串索引越界、任何导致无效浮点数的操作等。
常量间的所有算术运算、逻辑运算和比较运算的结果也是常量,对常量的类型转换操作或以下函数调用都是返回常量结果: len、cap、real、imag、complex 和 unsafe.Sizeof。
字面量
编程语言源程序中表示固定值的符号叫做字面量,也称字面常量。一般使用裸字符序列来表示不同类型的值。字面量可以被编程语言编译器直接转换为某个类型的值。
Go的字面量可以出现在两个地方: 一是用于常量和变量的初始化,二是用在表达式中作为函数调用实参。变量初始化语句中如果没有显式地指定变量类型,则Go编译器会结合字面量的值自动进行类型推断。Go中的字面量只能表达基本类型的值,Go不支持用户自定义字面量。
变量与常量的内存空间
堆和栈的数据都是动态变化的,字面量是不会变的,一般不会存储在这个区域对于字符串和大一点的数字一般存储在全局区,然后通过地址引用小一点的数字可能被直接编码成汇编指令的常量,所以在代码段
iota常量生成器
常量声明可以使用 iota 常量生成器初始化,它用于生成一组以相似规则初始化的常量,但是不用每行都写一遍初始化表达式。在一个 const 声明语句中,在第一个声明的常量所在的行,iota 将会被置为0,然后在每一个有常量声明的行 ,iota 加一。
abc 0,1,2 批量组合
const (
a = iota //0
b //1
c //2
d //3
)
const e = iota //0
iota只能在常量表达式中使用
可跳过的值
处理音频输出:音频可能无论什么都没有任何输出,或者它可能是单声道,立体声,或是环绕立体声的。
逻辑定义没有任何输出为 0,单声道为 1,立体声为 2,环绕立体声(5 个通道是全带宽通道)
我们可以使用下划线:Go没有匿名常量这种概念,”_”本身就是一个特殊的标识我们可以使用下划线(匿名常量 (不正确)符,被称为空白标识符)跳过不想要的值。
type AudioOutput int //自定义类型
const (
OutMute AudioOutput = iota //0无声音
OutMono //1 单声道
OutStereo//2立体声
_
_
OutSurrount//环绕立体声
)
底层具有相同相似的数据结构,无类型常量隐式转换进行给变量常量进行赋值的时候,考虑数据值(数据准确精度)的流失问题。
内建包
所谓内建函数,就是Go语言内部预定义实现的函数。调用它们的方式与调用普通函数并无差异,并且在使用它们之前也不需要导入任何代码包。
Println()函数就是一个内建函数,与之对应的还有print()功能这两个函数的区别是println()函数会自动换行,而print() 函数不会自动换行。像常见的还有len()、append()等函数。