值类型和应用类型

值类型包括: 基本数据类型 int类型,float系列, bool, string, 数组和结构体struct
引用类型:指针,slice切片,map, 管道chan,interface等都是引用类型

特点

  1. 值类型:变量直接存储值,内存通常在栈中分配

image.png

  1. 引用类型:变量存储的是一个地址,这个地址对应的空间才是真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,有GC来回收

image.png

  1. 内存分区

image.png

标识符

系统保留关键字
image.png
系统预定义标识符
image.png

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穿透。默认穿透一层。
image.png

  • type switch

image.png

编程的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
image.png

break 和continue

break注意事项

  1. break语句出现在多层嵌套循环时,可以通过标签指明要终止的是哪一层的语句块

案例:
image.png
continue注意事项

  1. continue语句出现在多层嵌套循环时,可以通过标签指明要终止的是哪一层的语句块

    goto
    不建议使用

return
return使用在方法和函数中,表示跳出所在的方法和函数,
说明:

  1. 如果return是在普通的函数,则表示跳出函数,即不再执行函数中return后面代码,也可以理解成终止函数
  2. 如果return是在main函数,表示终止main函数,也就是说终止程序

函数的递归调用

定义:
一个函数在函数体内调用了自己,称了函数的递归调用
需要遵守的重要原则

  1. 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
  2. 函数的局部变量是独立的,不会互相影响
  3. 递归必须向退出递归的条件逼近,否则就是无限递归,死循环;
  4. 当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁

init函数

每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用,也就是说init会在,main函数前被调用。

匿名函数

闭包

是一个函数和与其相关的引用环境组合的一个整体(实体)

defer

复制语句不能在函数体外

内置函数buildin

包-strings

函数练习题
image.png
image.png
image.png
image.png image.png
image.png
image.png
image.png

数组的练习
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png