Go变量和基本数据类型
Go变量
概念
变量相当于内存中一个数据存储空间的表示。通过变量名可以访问到变量(值)。
变量使用的基本步骤
- 声明变量(定义变量)
- 赋值
- 使用
|
|
变量使用注意事项
变量表示内存中的一个存储区域
该区域有自己的名称(变量名)和类型(数据类型)
Go变量使用的三种方式
指定变量类型,声明后若不赋值,使用默认值
1 2 3 4
var i int var name string fmt.Println("i: ", i) //i: 0 fmt.Println("name: ", name) //name:
根据值自行判定变量类型(类型推导)
1 2
i := 100 fmt.Printf("i: %d, i的类型:%T\n", i, i) //i: 100, i的类型:int
省略
var
,注意::=
左侧的变量不应该是已经声明过的,否则会导致编译错误
多变量声明
1 2 3 4 5 6 7 8
var a, b, c, d int fmt.Println(a, b, c, d) //0 0 0 0 a1, b1, c1, d1 := 1, 2, 3, 4 fmt.Println(a1, b1, c1, d1) //1 2 3 4 var a2, b2, c2, d2 = "a2", 2, "c2", 23.09 fmt.Println(a2, b2, c2, d2) //a2 2 c2 23.09
该区域的数据值可以在同一类型范围内不断变化
1 2 3 4 5 6 7
var name = "Joker" fmt.Println(name) //Joker name = "Tom" fmt.Println(name) //Tom name = "Sony" fmt.Println(name) //Sony // name = 10 //cannot use 10 (type untyped int) as type string in assignment
变量在同一作用域(在一个函数或者在代码块)内不能重名
1 2 3 4
var name = "Joker" fmt.Println(name) //Joker // 变量不能再同一作用域下重名 var name = "Tom" //previous declaration
变量=变量名+值+数据类型
Go的变量如果没有赋初始值,编译器会使用默认值,比如:int默认值是0,string默认值为空,float默认值也是0
1 2 3 4 5 6
var ( name string //默认值为空 age int //默认值为0 score float64//默认值为0.0 ) fmt.Printf("name: %s,age:%d,score:%f\n", name, age, score) //name:,age:0,score:0.000000
程序中+
号的使用
当左右两边都是数值型时,则做加法运算
1 2 3 4 5
var ( n1 = 100 n2 = 200 ) fmt.Println("n1 + n2 = ", n1+n2) //n1 + n2 = 300
当左右两边都是字符串,则做字符串拼接
1 2 3 4 5
var ( n3 = "Hello" n4 = "World!" ) fmt.Println("n3 + n4 = ", n3+n4) //n3 + n4 = HelloWorld!
变量的数据类型
每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间。
整数类型
基本介绍
用于存放整数值,比如0,-1,233
等
示例
|
|
整型的类型
类型 | 有无符号 | 占用存储空间 | 数值范围 | 备注 |
---|---|---|---|---|
int8 | 有 | 1字节 | -128~127 | |
int16 | 有 | 2字节 | -2^15~2^15-1 | |
int32 | 有 | 4字节 | -2^31~2^31-1 | |
int64 | 有 | 8字节 | -2^63~2^63-1 | |
int | 有 | 32位系统4个字节 64位系统8个字节 | -2^31 -2^63 | |
uint | 无 | 32位系统4个字节 64位系统8个字节 | 0 0 | |
rune | 有 | 与int32一样 | -2^31~2^31-1 | 等价int32,表示一个Unicode码 |
byte | 无 | 与uint8等价 | 0~255 | 当要存储字符时,选用byte |
整型的使用细节
Go各整数类型分类:有符号和无符号,int uint的大小和系统有关
Go的整型默认声明为int型
1 2
num := 100 fmt.Printf("num=%d, num的类型:%T\n", num, num) //num=100, num的类型:int
Go程序中整型变量在使用时,遵守保小不保大的原则,即:在保证程序正确运行下,尽量使用占用空间小的数据类型,比如:年龄
bit: 计算机中的最小存储单位。byte: 计算机中基本存储单元
浮点型
基本介绍
浮点型就是用于存放小数的,比如:1.2, 0.3, -1.293
示例
|
|
浮点类型的分类
类型 | 占用存储空间 | 数值范围 |
---|---|---|
单精度 float32 | 4字节 | -3.403E38~3.403E38 |
双精度 float64 | 8字节 | -1.798E308~1.798E308 |
说明:
浮点型的存储分为三部分:符号位+指数位+尾数位,在存储过程中,精度会有丢失
1 2 3 4 5
var ( n1 float32 = -123.0000901 n2 float64 = -123.0000901 ) fmt.Println("n1 = ", n1, " n2 = ", n2) //n1 = -123.00009 n2 = -123.0000901
float64的精度比float32的要准确
如果需要保存一个精度高的数,则应该选用float64
浮点型的使用细节
Go浮点类型有固定的范围和字段长度,不受具体OS的影响
Go的浮点型默认声明为float64类型
1 2
num3 := 12.09 fmt.Printf("num3的类型:%T\n", num3) //num3的类型:float64
浮点型常量有两种表示形式
十进制形式:如:
1 2 3
num4 := 5.12 num5 := .123 //0.123 fmt.Println("num4 = ", num4, " num5 = ", num5) //num4 = 5.12 num5 = 0.123
科学计数法形式:如:
1 2 3
num6 := 5.12e2 num7 := 5.12e-2 fmt.Println("num6 = ", num6, " num7 = ", num7) //num6 = 512 num7 = 0.0512
通常情况下,应该使用float64,因为它比float32更精准
字符类型(char)
基本介绍
Go中没有专门的字符类型,如果要存储单个字符(字母),一般使用byte
来保存。
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的,也就是说对于传统的字符串是由字符组成的,而Go的字符串不同,它是由字节组成的(官方将string归属到基本数据类型中)。
示例
|
|
说明:
- 如果我们保存的字符在ASCII表中,那么可以直接保存到byte
- 如果我们保存的字符对应码大于255,这时我们可以考虑使用int类型保存
- 如果我们需要按照字符的方式输出,这时我们需要格式化输出
fmt.Printf("%c 对应的码值:%d", c, c)
字符类型的使用细节
字符常量是用单引号(’’)括起来的单个字符。例如:
1 2 3
var c1 byte = 'a' var c2 byte = '中' var c3 byte = '9'
Go中允许使用转义字符
\
来表示将其后的字符转变为特殊字符型常量,例如:1
var c3 char = '\n' //'\n'表示换行符
Go语言的字符使用UTF-8编码;
在Go中,字符的本质是一个整数,直接输出时,是该字符对应的UTF-8编码的码值;
1 2 3 4 5 6 7 8
var ( c1 byte = 'a' c2 byte = '0' //字符的0 ) // 当我们直接输出byte值,就是输出了对应的字符的码值 fmt.Println("c1 = ", c1) //c1 = 97 fmt.Println("c2 = ", c2) //c2 = 48
可以直接给某个变量赋一个数字,然后按格式化输出时使用
%c
会输出该数字对应的unicode字符;1 2 3
//可以直接给某个变量赋一个数字,然后按照格式化输出使用%c,会输出该数字对应的Unicode字符 var c4 int = 22269 fmt.Printf("c4=%c\n", c4) //c4=国
字符类型是可以进行运算的,相当于一个整数,因为它都对应的有Unicode码。
1 2 3
//字符类型是可以进行运算的,相当于一个整数,运算时按照码值运行 var n1 = 10 + 'a' // 10 + 97 fmt.Println("n1 = ", n1) // n1 = 107
字符类型的本质
- 字符型 存储到计算机中,需要将字符对应的码值(整数)找出来
- 存储:字符 -> 对应码值 -> 二进制 -> 存储
- 读取:二进制 -> 码值 -> 字符 -> 读取
- 字符和码值的对应关系是通过字符编码表来决定的(是已经规定好的)
- Go语言的编码都统一成了
utf-8
,再也没有编码的困扰了
布尔类型(bool)
基本介绍
- 布尔类型也叫bool类型,bool类型数据只允许取值true和false
- bool类型占1个字节
- bool类型适用于逻辑运算,一般用于程序流程控制
示例
|
|
布尔类型的使用细节
- 不可以0或非0的整数替代false和true
字符串类型(string)
基本介绍
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本
示例
|
|
字符串类型的使用细节
Go语言的字符串的字节使用UTF-8编码标识Unicode文本;
字符串一旦赋值了,字符串就不能修改了:在Go中字符串是不可变的
字符串的两种表示形式
- 双引号,会识别转义字符
- 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
字符串拼接方式
1 2 3 4 5
var str string str = "hello " + "world!" fmt.Println(str) //hello world! str += "ok" //+=等价于 str = str + "ok" fmt.Println(str) //hello world!ok
当一行字符串太长时,需要使用到多行字符串
1 2 3
str2 := "hello " + // 使用多行字符串,+号必须在结尾 "world!" fmt.Println(str2) //hello world!
基本数据类型默认值
在Go中,数据类型都有一个默认值,当没有赋值时,就会保留默认值,在Go中默认值又叫零值。
数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0 |
字符串 | "" |
布尔类型 | false |
|
|