️go语言官方编程指南:https://golang.org/#

go语言的官方文档学习笔记很全,推荐去官网学习

1.指针

1.1基本介绍

  1. 基本数据类型,变量存的就是值,也叫值类型
&



在内存的情况:



1.2 指针变量

指针变量指向的是一个地址,这个地址指向的空间才是值。

解释:

  1. ptr是一个指针变量,类型是一个*int类型,==是一个地址==
  2. ptr本身的值是&i



1.3 指针的使用流程

指针使用流程:

  • 定义指针变量。
  • 为指针变量赋值。
  • 访问指针变量中指向地址的值。

在指针类型前面加上 * 号(前缀)来获取指针所指向的内容。

实例

以上实例执行输出结果为:


1.4 Go 空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。

nil 指针也称为空指针。

nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。

一个指针变量通常缩写为 ptr。

实例

以上实例输出结果为:

空指针判断:

1.5指针变量的修改

❤️ 由此可见,golang 相对C语言和c++的指针,相对简单而且容易理解

小方法:

当我们

2. 值类型和引用类型

  1. 值类型:都有对应的指针类型,形式为 数据形式,比如int 的对应的指针就是 int ,* float32是float对应的指针类型
  2. 值类型包括:基本数据类型 int系统,float系列,bool,string,struct和结构体。
  3. 引用类型:指针,slice切片,map,管道chan,interface等都是

2.1 区别/使用:

值类型:变量可以之间存储值,内存通常在栈中分配

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



eng:内存是由栈区和堆区组成

3. 标识符的命名规范

  1. Golang对各种变量、方法、函数等命名时使用的字符序列称之为标识符
  2. 凡是自己可以其名字的地方都叫标识符

3.1 标识符的命名规范

go  var num int = 10  var Num int = 100  //num 和 Num是不同的变量__“__"go  var _ int = 40  //错误  var a_ai int = 40   //正确

3.2 标识符命名注意事项

  1. 包名:Golang 每一个go文件 都归属于一个包,包名应该保持和目录尽量一致
  2. 变量名、函数名、常量名:采用驼峰法
    1. 第一个字母小写,第二个字母大写
    2. var goodPrice float32 = 1234.234


  1. ==变量名、函数名、常量名首字母大写,则可以被其他包访问; 如果首字母小写,则只能在本包中使用==(注意❤️ -- 参考其他语言:理解为首字母大写是公开的(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 ,向下取整==

  1. ==在Golang,++和--只能独立使用==,强制语法统一性和简洁性
  2. 在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步骤:

  1. 导入fmt包
  2. 调用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. 单分支
  2. 双分支
  3. 多分支

注意❤️:

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数字