变量
概念
变量是计算机语言中存储数据的抽象概念。变量的功能是存储数据。变量通过变量名访问。
变量的本质是计算机分配的一小块内存,专门用于存放指定数据,在程序运行过程中该数值可以发生改变。
变量的存储往往具有瞬时性,或者说是临时存储,当程序运行结束,存放该数据的内存就会释放,而该变量就会消失。
Go语言的变量名有字母,数字,下划线组成,首个字符不能为数字。
Go语法规定,定义的局部变量若没有被调用则编译错误。
命名:驼峰标识,不建议用下划线连接多个单词。
声明变量
变量声明有多种形式
//未初始化的标准格式
var 变量名 变量类型
// 未初始化的批量格式
var (
a int
b string
c []float32
)
// 未初始化变量的默认值
// 整形和浮点型变量默认值:0
// 字符串默认值是空字符串
// 布尔型默认值为false
// 函数,指针变量初始值为nil
// 初始化变量的标准格式
var 变量名 类型 = 表达式
// 初始化变量的编译器自动推断类型格式
var 变量名 = 表达式
// 初始化变量的简短声明格式
变量名 := 表达式
// 使用 := 赋值操作符,可以高效地创建一个新的变量,称之为初始化声明
// 声明语句省略var关键字
// 这是声明变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值
// 该变量名必须是没有定义过的变量,若定义过,将发生编译错误。
// 在多个简短变量声明和赋值中,至少有一个新声明的变量出现在左侧中,那么即便有其他变量名可能是重复声明,编译器也不会报错。
变量多重赋值(多个变量同时赋值)
Go语法中,变量初始化和变量赋值是两个不同的概念。Go语言的变量赋值与其他语言一样,但是Go提供了其他程序员期待已久的多重赋值功能,可以实现变量交换。多重赋值让Go语言比其他语言减少了代码量。
z ,t:= 1 ,2
z, t = t , z
匿名变量
Go语言的函数可以返回多个值,而事实上并不是对所有的返回值都用得上,那么就可以使用匿名变量,用“_”下换线替代即可。
匿名变量不占用命名空间,不会分配内存。
数据类型
基本数据类型(原生数据类型):整形,浮点型,布尔型,字符串,字节byte和字符rune.
复合数据类型(派生数据类型):指针(pointer),数组(array),切片(slice),映射(map),函数(function),结构体(struct),通道(channel)
整形
整形分两大类
- 按长度分: int8,int16 int32 int64 int
- 无符号整形 uint8, uint16 uint32 uint 64 uint
- 其中uint8就是byte型,int16对应C语言的short型,int64对应C语言的long型
浮点型
Go语言支持4种浮点型书: float32,float64,float64 ,cmplex64(32位实数和虚数),complex128(64位实数和虚数)
float32 的最大范围是3.4e38,用常量定义的是math.MaxFloat32
float64的最大范围是1.8e308,用常量定义的是math.MaxFloat64
布尔型
声明方式: var flag bool
布尔型无法参与数值运算,也无法与其他类型进行转换
字符串
字符串在Go语言中是一基本数据类型出现的,使用字符串像使用其他原生基本数据类型int,float32,float64,bool一样。
- 字符串可以使用转义符
- \r 回车符return,返回行首
- \n 换行符 new line 直接跳到下一行的同列位置
- \t 制表符TAB
- \’ 单引号
- \" 双引号
- \\ 反斜杠
- 定义多行字符串
- 双引号书写字符串被称为字符串字面两(string literal) .这种字面量不能跨行
- 多行字符串需要使用"`"反引号,多用于内嵌源码和内嵌数据
- 在反引号中的所有代码不会被编译器识别,而是作为字符串的一部分
字符
字符串中的每一个元素叫做“字符”,定义字符时使用单引号。Go语言的字符有两种:
-
byte型: 其实就是uint8的别名。代表了一个ASCII码的一个字符
-
rune型: 其实就是int32。代表一个UTF-8字符。当需要处理中文等unicode字符集时需要用到rune型
var a byte ='a' var b rune ='-'
打印格式化
通用
- %v 值得默认格式标识 value
- %+v 类似%v,但输出结构体时会添加字段名
- %#v 值的Go语法表示
- %T 值的类型的Go语言表示 type
布尔
%t 单词true或false true
整形
- %b 表示为二进制 binary
- %c 该值对应的unicode码值 char
- %d 表示为十进制 digital
- %8d 表示该整形长度是8,不足8则在数值前补空格。如果超出8,则以实际为准。
- %08d 数字长度为8,不足8位的,在数字前补0.如果超出8,则以实际为准
- %o 表示为八进制 octal
- %q 该值对应的单括号括起来的go语法字符字面值,必要时会采用安全的转义表示 quotation
- %x 表示为十六进制,使用a-f hex
- %X 表示为十六进制,使用A-F
- %U 表示Unicode格式:U+1234 等价于“U+%0.4x”
浮点数与复数
- %b 无小数部分,二进制指数的科学计数法,如-123456p-78 参见strconv.FormatFloat
- %e (=%.6e) 有6位小数部分的科学计数法,如-1234.456e+78
- %E 科学计数法,如-1234.456E+78
- %f (=%.6f)有6位小数部分 如123.456123 float
- %F 等价于%f
- %g 根据实际情况采用%e或%f格式
- %G 根据实际情况采用%E或%F格式
字符串和[]byte
- %s 直接输出字符串或者[]byte string
- %q 该值对应的双引号括起来的Go语法字符串字面值,必要时会采用安全的转义表示
- %x 每个字符用两个字符十六进制数表示(a-f)
- %X 每个字符用两个字符十六进制数表示(A-F)
指针
- %p 表示为十六进制,并加上前导的0x pointer
- 没有%u.整形如果是无符号类型自然输出也是无符号。没有必要指定操作数的类型(int8,int64)
- 宽度通过一个紧跟在百分号后面的十进制数指定,如果为指定宽度,则表示值是除必需之外不做填充。精度通过(可选的)宽度后跟的十进制数指定。如果未指定精度,会使用默认精度;如果点号没有跟数字,表示精度为0
数据类型转换
数据类型转换格式
-
T(表达式)
采用数据类型前置加括号的方式进行类型转换。T表示要转换的类型;表达式包括变量,数值,函数返回值等。
类型转换时,需要考虑两种类型之间的关系和范围,是否会发生数值损失
布尔型无法与其他类型进行转换
-
float与int 之间转换
需要注意 float转int时精度损失
-
int 转string
其实相当于是byte或者rune转string
该int数值是ASCll码的编号或Unicode字符集的编号。转成string就是根据字符集,将对应编号的字符查找出来。
当前数值超出Unicode编号范围,则转成的字符串显示为乱码
-
string 转int
不允许字符串转int
常量
声明方式
- 相对于变量,常量是恒定不变的值,例如 圆周率
常量是一个简单值的标识符,在程序运行时,不会被修改。
-
常量中的数据类型只能是布尔型,整型,浮点型,复数和字符串。
-
常量定义格式
- const 标识符 [类型] = 值
- 可以省略类型说明[类型],编译器会根据变量的值来自动推断类型
- 显式类型定义 : const A string = “zxt”
- 隐式类型定义 :const B =“zxt”
-
多个相同类型的声明可以简写为:
const A ,B = 1546,666
-
常量定义后未被使用,不会再编译时出错
枚举
- 常量用于枚举
const (
zxt = 100
aa = 55
cc = 555
)
- 常量组中如果不指定类型和初始值,则与上一行非空常量的值相同
const(
a = 11
b
c
)
iota
- iota,特殊常量值,系统定义的可以被编译器修改的常量值。iota只能用在常量赋值中。
- 在每一个const关键字出现时,被重置为0,然后每出现一个常量,iota所代表的数值会自动增加1。iota可以理解成常量组中常量的计数器,不论该常量是什么,只要有一个常量,那么iota就加1
- iota可以被用作枚举值
const(
a = iota
b = iota
c = iota
)
- 常量组中如果不指定类型和初始值,则与上一行非空常量的值相同。
类型别名(Type Alias)
简述
类型别名是Go1.9版本添加的新功能。主要用于代码升级,迁移中类型的兼容性问题。
在Go1.9版本前内建类型定义的代码是:
type byte uint8
type rune int32
在Go1.9版本之后变更为:
type byte = uint8
type rune = int32
类型别名与类型定义
类型别名的语法格式
type 类型别名 = 类型
定义类型的语法格式
type 新类型名 类型
非本地类型不能定义方法
不能为不在同一个包中的类型定义方法