值类型和应用类型
值类型包括: 基本数据类型 int类型,float系列, bool, string, 数组和结构体struct
引用类型:指针,slice切片,map, 管道chan,interface等都是引用类型
特点
- 值类型:变量直接存储值,内存通常在栈中分配
- 引用类型:变量存储的是一个地址,这个地址对应的空间才是真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,有GC来回收
- 内存分区
标识符
系统保留关键字
系统预定义标识符
3.18.3 标识符的案例
hello // ok
hello12 //ok
1hello // error ,不能以数字开头h-b // error ,不能使用 -
x h // error, 不能含有空格
// ok
// ok , 我们要求大家不要这样使用
h4
_ab
int
float32 // ok , 我们要求大家不要这样使用 // error
Abc // ok3.18.4 标识符命名注意事项
1) 包名:保持 package 的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,不要和 标准库不要冲突 fmt
2) 变量名、函数名、常量名:采用驼峰法 举例:
var stuName string = “tom” 形式: xxxYyyyyZzzz ..
var goodPrice float32 = 1234.5
3) 如果变量名、函数名、常量名首字母大写,则可以被其他的包访问;如果首字母小写,则只能
在本包中使用 ( 注:可以简单的理解成,首字母大写是公开的,首字母小写是私有的) ,在 golang 没有public , private 等关键字。
运算符介绍
运算符的基本介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等1) 算术运算符
2) 赋值运算符
3) 比较运算符/关系运算符4) 逻辑运算符
5) 位运算符
6) 其它运算符
八进制和十六进制的赋值表示方法
八进制: 数字前面加上0
例: var i := 01232
十六进制: 数字前面加上0x或0X
例: var i := 0x123
进制间转换
- 二进制转八进制
将二进制数,从低位开始,每3位一组,转成八进制即可。
例:11010101 —> 11 010 101 —> 0325
- 二进制转十六进制
将二进制数,从低位开始,每4位一组,转成八进制即可。
例: 11010101 —> 1101 0101 —> 0xD5
- 八进制转二进制
将八进制每1位,转成对应的一个3位的二进制的数即可。
例: 0237 —> 10 011 111 —> 10011111
- 十六进制转二进制
将十六进制每1位,转成对应的一个4位的二进制的数即可。
例: 0x237 —> 0010 0011 1110 —> 1000110111
原码、反码,补码
对于有符号而言
1)二进制的最高位是符号位: 0表示正数,1表示负数;
1—> [0000 0001]
-1—>[1000 0001]
2)正数的原码、反码、补码都一样;
3)负数的反码=它的原码符号位不变,其它位取反(0->1; 1->0);
4)负数的补码=它的反码+1;
1—> 原码[0000 0001] 反码[0000 0001] 补码[0000 0001]
-1—>原码[1000 0001] 反码[1111 1110] 补码[1111 1111]
5)0 的反码、补码都是0;
6)在计算机运算的时候,都是以补码的方式来运算;
1+1 1-1=1+(-1)
位运算符
按位与& : 两位全为1,结果为1, 否则为0;
按位或| : 两位有一个为1,结果为1,否则为0;
按位异或^ : 两个有一个为0, 一个为1, 结果为1,否则为0;
例:
2 & 3 = 2
2的补码 0000 0010
3的补码 0000 0011
0000 0010 =2
2|3= 3
2的补码 0000 0010
3的补码 0000 0011
0000 0011 =3
2 ^ 3= 1
2的补码 0000 0010
3的补码 0000 0011
0000 0001 =1
-2 ^ 3= -3
-2的原码 1000 0010,反码 1111 1101,+1=补码 1111 1110
3的补码 0000 0011
-2的补码 1111 1110
-2 ^ 3 1111 1101 (补码) —> 找到原码
1111 1101 —> 反码 1111 1100—>原码 1000 0011 —> -3
移位运算符
golang中有2哥移位运算符:
>> , << 右移和左移,运算规则:
右移运算符 >> : 低位溢出,符号位不变,并用符号位补溢出的高位
左移运算符 << : 符号位不变,低位补0
例:
a := 1>>2 补码: 0000 0001 —> 0000 0000 =0
b := 1<<2 补码: 0000 0001 --> 0000 0100 = 4
switch细节点
- switch穿透
穿透-fallthrought。如果在case语句块后增减fallthrought,则会继续执行下一个case,也叫switch穿透。默认穿透一层。
- type switch
编程的2大绝招:
1 先易后难
2 先写死后写活
生成随机数
rand
为了生成一个随机数,还需要rand设置 一个种子 .
time.Now().Unix(): 返回一个从1970:01:01 的0时0分0秒到现在的秒数
rand.Seed(time.Now().Unix())
如何随机生成1-100的整数
n:=rand.Intn(100)+1
break 和continue
break注意事项
- break语句出现在多层嵌套循环时,可以通过标签指明要终止的是哪一层的语句块
案例:
continue注意事项
continue语句出现在多层嵌套循环时,可以通过标签指明要终止的是哪一层的语句块
goto
不建议使用
return
return使用在方法和函数中,表示跳出所在的方法和函数,
说明:
- 如果return是在普通的函数,则表示跳出函数,即不再执行函数中return后面代码,也可以理解成终止函数
- 如果return是在main函数,表示终止main函数,也就是说终止程序
函数的递归调用
定义:
一个函数在函数体内调用了自己,称了函数的递归调用
需要遵守的重要原则
- 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
- 函数的局部变量是独立的,不会互相影响
- 递归必须向退出递归的条件逼近,否则就是无限递归,死循环;
- 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁
init函数
每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在,main函数前被调用。
匿名函数
闭包
是一个函数和与其相关的引用环境组合的一个整体(实体)
defer
复制语句不能在函数体外
内置函数buildin
包-strings
函数练习题
数组的练习