️go语言官方编程指南:https://golang.org/#
go语言的官方文档学习笔记很全,推荐去官网学习
1.指针
1.1基本介绍
- 基本数据类型,变量存的就是值,也叫值类型
&
在内存的情况:
1.2 指针变量
指针变量指向的是一个地址,这个地址指向的空间才是值。
解释:
- ptr是一个指针变量,类型是一个*int类型,==是一个地址==
- ptr本身的值是&i
1.3 指针的使用流程
指针使用流程:
- 定义指针变量。
- 为指针变量赋值。
- 访问指针变量中指向地址的值。
在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。
实例
以上实例执行输出结果为:
1.4 Go 空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
一个指针变量通常缩写为 ptr。
实例
以上实例输出结果为:
空指针判断:
1.5指针变量的修改
❤️ 由此可见,golang 相对C语言和c++的指针,相对简单而且容易理解
小方法:
当我们
2. 值类型和引用类型
- 值类型:都有对应的指针类型,形式为 数据形式,比如int 的对应的指针就是 int ,* float32是float对应的指针类型
- 值类型包括:基本数据类型 int系统,float系列,bool,string,struct和结构体。
- 引用类型:指针,slice切片,map,管道chan,interface等都是
2.1 区别/使用:
值类型:变量可以之间存储值,内存通常在栈中分配
引用类型:变量存储的是一个地址,这个地址对应的空间才是真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,这个地址对应的数据空间就成为一个垃圾,由GC回收
eng:内存是由栈区和堆区组成
3. 标识符的命名规范
- Golang对各种变量、方法、函数等命名时使用的字符序列称之为标识符
- 凡是自己可以其名字的地方都叫标识符
3.1 标识符的命名规范
go var num int = 10 var Num int = 100 //num 和 Num是不同的变量__“__"go var _ int = 40 //错误 var a_ai int = 40 //正确
3.2 标识符命名注意事项
- 包名:Golang 每一个go文件 都归属于一个包,包名应该保持和目录尽量一致
- 变量名、函数名、常量名:采用驼峰法
- 第一个字母小写,第二个字母大写
- var goodPrice float32 = 1234.234
- ==变量名、函数名、常量名首字母大写,则可以被其他包访问; 如果首字母小写,则只能在本包中使用==(注意❤️ -- 参考其他语言:理解为首字母大写是公开的(pubilc),首字母小写是私有的(private))
4. Go算数运算符
下表列出了所有Go语言的算术运算符。假定 A 值为 10,B 值为 20。
| 运算符 | 描述 | 实例 | | :----: | :--: | :----------------: | | + | 相加 | A + B 输出结果 30 | | - | 相减 | A - B 输出结果 -10 | | * | 相乘 | A * B 输出结果 200 | | / | 相除 | B / A 输出结果 2 | | % | 求余 | B % A 输出结果 0 | | ++ | 自增 | A++ 输出结果 11 | | -- | 自减 | A-- 输出结果 9 |
和其他语言相似,不举例。
细节:
x := 19/5
==此时x=3 ,向下取整==
- ==在Golang,++和--只能独立使用==,强制语法统一性和简洁性
- 在Golang中,++ 或者--只能写在变量后面,不能写在前面
```go var a int =5 a = i++ //错误,只能独立使用 a = i-- //错误 a++ //正确 ++a //错误
if i++ > 0{ //错误,在if语句中,非独立使用的 fmt.Println("ok") } ```
5. Go关系运算符
关系运算符也称之为比较运算符,常用于流程控制
结果是bool类型,要么是true要么是false
下表列出了所有Go语言的关系运算符。假定 A 值为 10,B 值为 20。
| 运算符 | 描述 | 实例 | | :----- | :----------------------------------------------------------- | :---------------- | | == | 检查两个值是否相等,如果相等返回 True 否则返回 False。 | (A == B) 为 False | | != | 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 | (A != B) 为 True | | > | 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 | (A > B) 为 False | | < | 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 | (A < B) 为 True | | >= | 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 | (A >= B) 为 False | | <= | 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 | (A <= B) 为 True |
6. 逻辑运算符
表列出了所有Go语言的逻辑运算符。假定 A 值为 True,B 值为 False。
| 运算符 | 描述 | 实例 | | :----- | :----------------------------------------------------------- | :----------------: | | && | 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 | (A && B) 为 False | | \|\| | 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 | (A \|\| B) 为 True | | ! | 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | !(A && B) 为 True |
和其他语言都差不多
||&&
6.1 实例
测试:
7. 位运算符 -- 学习二进制的时候再补充
8. 其他运算符
❤️说明:Go语言明确说明不支持三元运算符
8.1 补充,其它语言的三元运算符:
条件表达式?表达式1:表达式2
说明:问号前面的位置是判断的条件,判断结果为bool型,为true时调用表达式1,为false时调用表达式2。
其逻辑为:“如果条件表达式成立或者满足则执行表达式1,否则执行第二个。”常用在设置默认值,例如某个值不一定存在,则判断这个值是否存在,不存在给默认值(表达式2)。
8.2 Golang三元运算符的实现使用if判断
8. 键盘输入
参考第二天的最后笔记
8.1步骤:
- 导入fmt包
- 调用fmt包的fmt.Scanln() 或者 fmt.Scanf()
案例:
9. 进制
9.1 基本的输出方式
9.2 补充python中进制的转换
在ipython模式下的进制转化是我认为最方便的一种
hex(10)oct(10)bin(10)int('0x5',16)int('0o5',8)int('0b1100',2)
10 .位运算
位运算符对整数在内存中的二进制位进行操作。
下表列出了位运算符 &, |, 和 ^ 的计算:
| p | q | p & q | p \| q | p ^ q | | :--: | :--: | :---: | :----: | :---: | | 0 | 0 | 0 | 0 | 0 | | 0 | 1 | 0 | 1 | 1 | | 1 | 1 | 1 | 1 | 0 | | 1 | 0 | 0 | 1 | 1 |
假定 A = 60; B = 13; 其二进制数转换为:
10.1 实例
编译:
10.2 原码、补码、反码
❤️注意:在计算机运算的时候,都是以补码的方式来运算的
10.3 golang 中的位运算
Go 语言支持的位运算符如下表所示。假定 A 为60,B 为13:
| 运算符 | 描述 | 实例 | | :----- | :----------------------------------------------------------- | :------------------------------------- | | & | 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 | (A & B) 结果为 12, 二进制为 0000 1100 | | \| | 按位或运算符"\|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 | (A \| B) 结果为 61, 二进制为 0011 1101 | | ^ | 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 | (A ^ B) 结果为 49, 二进制为 0011 0001 | | << | 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | A << 2 结果为 240 ,二进制为 1111 0000 | | >> | 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 | A >> 2 结果为 15 ,二进制为 0000 1111 |
10.4案例:
先求补码,再计算
正数的补码与原码相同。负数的补码的符号位为1,其余位为该数绝对值的原码按位取 反,然后整个数加1。
输出
位移运算:也遵守按照补码计算
分析:
c:0000 0001 => 0000 0100 = 4
a:0000 0001 => 0000 0000 = 0
11. 流程控制
❤️❤️❤️ 为了更好的区分理解,这部分将和python一同介绍
程序由上到下逐步执行(参考python交互式脚本语言) ,中间没有任何的判断和跳转。
变量应该先声明后定义,再使用。
11.1 Go分支控制if -else
- 单分支
- 双分支
- 多分支
注意❤️:
1. 和C/C++不同,在Golang中就算只写一行代码,也需要有{}
2. Go中的if还有一个强大之处是在条件判断语句中允许申明一个变量,这个变量的作用域只能在该条件逻辑块内,在其他地方是不起作用的
Go 编程语言中 if 语句的语法如下:
Go 编程语言中 if...else 语句的语法如下:
If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则执行 else 语句块。
Go 编程语言中 if...else 语句的语法如下:
你可以以同样的方式在 if 语句中嵌套 else if...else 语句
但是不建议嵌套过多,尽量控制在三层
案列:
定义两个变量int32 ,判断二者之和,是否能被3又能被5整除,打印提示信息
判断闰年:
注意:使用数字运算的时候要引入math包进行数字运算
11.2 补充:python分支控制if -else
python语句要注意缩进问题
import random :引入随机库
x = random.randint(0,3):表示随机生成0~3数字