标识符
Golang
中对各种变量、方法、函数等命名时使用的字符序列,叫做标识符。
- 命名规则
- 26个大小写字母,
0-9
还有_
组成 - 数字不能开头;严格区分大小写
- 标识符中不能包含空格
- 不能使用保留关键字(25个)作为标识符;
var int int = 30
,int
不是保留关键字,语法通过但是不推荐 - 下划线本身就是特殊的标识符,称为空标识符,可代表任意其他的标识符,对应的值会被忽略,仅仅是作为占位符使用。
- 标识符命名注意事项
- 包名:包名和目录名保持一致,简短有意义
- 变量名:采用驼峰体(第一个单词的首字母小写,其余单词的首字母大写)
- 如果变量名、函数名、常量名的首字母大写,则外部可以访问
保留关键字
总共有25个
预定标识符
总共36个,包含数据基本类型和系统内嵌函数
从终端中获取输入语句
接收用户输入的数据,使用键盘输入语句来获取。
- 导入
fmt
包 - 使用
fmt
包中的fmt.Scanln()、fmt.Scanf()
fmt.Scanln()
:获取一行输入fmt.Scanf()
:按照指定的format
格式输入
1 | func main(){ |
变量
变量 = 变量名 + 值 + 数据类型
-
声明变量
-
变量赋值
-
使用变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package main
import "fmt"
// 一次性声明多个变量
var (
n1 = 100
n2 = "xiaoming"
n3 = 200
)
func main(){
var i int // var i = 10
i = 10
i = 30
var x = 5 // 类型推导方式
j := 20 // 短变量方式,只能在函数内部声明
fmt.Println(i, x, j) // i的结果是30,在同一个区域内值可以发生变化,类型不能改变
fmt.Println(n1, n2, n3)
}
变量声明三种使用方式
-
指定变量类型,声明后没有赋值,使用的是默认值(int是0,string是空值)
-
根据值进行自动推导变量类型
-
短变量声明
1
2
3
4
5
6
7
8
9
10
11// 多变量声明
func main(){
// 声明未赋值,值都是初始值
var n1, n2, n3 int // 全部是0
// 声明并赋值
var n1, name, n2 = 100, "xiaoming", false
// 短变量声明
n1, name, n2 := 100, "xiaoming", false
}
运算符
- 算术运算符
1 | func main(){ |
1 | // 练习题 |
-
关系运算符
-
结果只有
false
和true
-
主要是用在
for
和if
的循环控制中 -
比较运算符是
==
而不是=
-
-
逻辑运算符
- 与:$$,短路与
- 或:||,短路或
- 非:!
1 | package main |
-
赋值运算符
符号 说明 = 基本赋值 += 加之后再赋值 -= 减之后再赋值 *= 乘之后再赋值 /=、%= 取整、求余后再赋值 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21// 赋值交换
func test(){
return 9
}
func main(){
a := 9 // 定义两个变量
b := 2
t := a // 定义一个临时变量t
a = b // 将b的值赋值给a
b = t // 将t的值赋值给b
// 赋值表达式的左边只能是变量,右边可以是变量、常量、表达式、函数等
var c int
c = a
c = 9 + 1
c = test() + 4
c = 88
fmt.Println(c)
}1
2
3
4
5
6
7
8
9// 交换两个变量,不使用中间变量
func main(){
var a int = 10
var b int = 20
a = a + b // a = 10 + 20;此时a变成30,b不变为20
b = a - b // b = 30 - 20;此时b变成10,a还是上面的30
a = a - b // a = 30 - 10;此时a变成20,b还是上面的10
} -
运算符优先级
- 括号,++,–
- 单目运算符(右—>左)
- 算术运算符
- 移位运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符(右—>左)
- 逗号
-
进制
- 二进制:0-1,满2进1;
Golang
中不能直接表示二进制- 二进制转成八进制:低位开始,每3位一组
11010101=0325
- 二进制转成十六进制:低位开始,每4位一组
11010101=0xD5
- 二进制转成八进制:低位开始,每3位一组
- 十进制:0-9,满10进1
- 八进制:0-7,满8进1,数字0开头。八进制转成二进制:每1位分别转成3位的二进制
0237=10011111
- 十六进制:0-9,A-F,满16进1;以
0X
或者0x
开头。字母不区分大小写。十六进制转成二进制:每位转成4位的二进制0x237=1000110111
1
2
3
4
5
6
7
8
9
10
11
12
13
14func main(){
// 二进制输出
i := 5
fmt.Printf("%b \n",i)
// 八进制
j := 011 // 9
fmt.Println(j)
// 十六进制
k := 0x11 // 17
fmt.Println(k)
} - 二进制:0-1,满2进1;
-
位运算符
计算机内部的计算都是通过二进制的方式进行。
- 按位与&:两个都是1,结果才是1,否则是0
- 按位或|:只要有一个1,结果为1,否则是0
- 按位异或^:一个0,一个1,结果才是1,否则是0
- 左移运算符<<:符号位不变,低位补0
- 右移运算符>>:低位溢出,符号位不变,并用符号位补充溢出的高位
1 | // 3种位运算 |
- 其他运算符
1 | // & 取地址和 * 取地址中的值 |
9 . 原码、反码、补码
二进制的最高位表示符号位,0表示正数,1表示负数。
-
正数的原码、反码、补码都是一样的
-
负数的反码 = 原码符号位不变,其他位取反(0和1取反)
-
负数的补码=反码 + 1
-
0的反码和补码都是0
在计算机中的运算都是通过补码的形式来进行的。
数据类型
bit
是计算机中的最小存储单位,byte
是计算中基本存储单元。byte = 8 * bit
go
中默认是整型int
。实际中,在保证程序正常运行的情况下,保小不保大,节省空间。
-
基本数据类型
- 数值型
- 整数型:int,int8/16/32/64;uint,uint8/16/32/64(1,2,4,8个字节)
- 浮点型:float32(4字节),float64(8字节);可能造成精度损失,64位更精确
- 字符型
- byte:uint8,存储字符选用byte;无符号(0-255)
- rune:int32,处理中文,有符号
- 布尔型bool
- 字符串string
- 数值型
-
派生数据类型
- 指针pointer
- 数组array
- 结构体structure
- 管道Chanel
- 函数function
- 切片slice
- 接口interface
- 映射map
1 | package main |
需要注意的地方:
- 浮点类型可能造成精度损失;
float64
更加精确 - 浮点类型有固定的长度和字符类型,不受操作系统的影响
Golang
中默认的是float64
,开发中建议使用- 支持科学计数法:5.23e5 = 5.23 * 10的5次方
字符类型
go
中没有专门的字符串类型,一般使用byte
表示;如果直接输出byte
的变量,实际上是输出其对应的ascii
码值。go`中字符串是由字节组成的。
1 | package main |
- 如果保存的值在255之内,可以使用
byte
- 如果超出255,使用
int
- 字符常量用单引号括起来
- 使用的是
utf-8
编码,英文字母是一个字节,汉字是3个字节。 - 字符的本质是一个整数,直接输出时,就是该字符对应的UTF-8编码
- 字符类型是可以进行运算的,相当于是整数,对应的是
Unicode
码 - 存储:字符—>对应码值—>二进制—>存储
- 读取:二进制—>码值—>字符—>读取
布尔类型
只有两个false
和 true
,占用一个字节;主要是用于流程控制
字符串类型
字符串是由一连串的字符连接起来的字符序列,使用的utf-8
编码标识的unicode
文本。
1 | package main |
- 字符串一旦赋值,就不能被修改
- 双引号可以识别转义字符
- 支持使用反引号``,使得字符串以原生的形式输出,包括换行和特殊字符
- 使用utf-8,解决中文乱码问题
默认值和强制转换
默认值
当数据类型没有被赋值,则使用零值。
- 整型:0
- 浮点型:0
- 字符串:""
- 布尔型:false
转换
go中是强制类型转换,显式转换,不能自动转换。
1 | package main |
- 被转换的是变量存储的数据,变量本身的数据类型是没有变化的。
- 范围大—>范围小,编译不会报错,按照溢出处理
基本数据类型—>string
fmt.Sprintf
:生成格式化的字符串,并返回字符串
1 | func main(){ |
- strconv包中的函数
- FormatInt
- FormatBool
- FormatUint
- FormatFloat
string—>基本数据类型
使用的是strcon
包中的函数;要确保string
类型能够转成有效的数据。比如“123”能转成整型,但是“hello”不行,Golang
直接转成零值。
1 | package main |
指针
- 对于基本数据类型,变量存的就是值,也叫做值类型
- 获取变量的地址用
&
,获取地址的值用*
- 指针变量存的是地址,地址指向的空间存的才是真正的值
var ptr *int = &num
,ptr
就是指针。 - 值类型都有对应的指针类型,
*datatype
。int—>*int;float—>*float。值类型包含- Int\float
- bool\string
- 数组array
- 结构体struct
1 | func main(){ |
1 | // 输出地址 |
1 | // 指针练习 |
值类型和引用类型
-
值类型:变量直接存储值,内存通常在栈中进行分配
-
int\float
-
bool\string
-
数组
array
-
结构体
struct
-
-
引用类型:变量存储的是地址,地址的空间才是真正存储的数据(值),内存通常在堆上进行分配。如果没有任何变量引用这个地址,由
GC
进行垃圾回收- 指针
pointer
- 切片
slice
- 映射
map
- 管道
channel
- 接口
interface
- 指针