目录
Golang 官方标准库 API 文档, https://golang.org/pkg 可以查看 Golang 所有包下的函数和使用
1.简介:
Go 语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率 ,使用一个表达式来形容 Go 语言:Go = C + Python , 说明 Go 语言既有 C 静态语言程 序的运行速度,又能达到 Python 动态语言的快速开发。
-
从 C 语言中继承了很多理念,包括表达式语法,控制结构,基础数据类型,调用参数传值,指针等 等,也保留了和 C 语言一样的编译执行方式及弱化的指针 举一个案例(体验): //go 语言的指针的使用特点(体验) func testPtr(num *int) { *num = 20 }
-
引入包的概念,用于组织程序结构,Go 语言的一个文件都要归属于一个包,而不能单独存在。
-
垃圾回收机制,内存自动回收,不需开发人员管理
-
天然并发 (重要特点)
(1) 从语言层面支持并发,实现简单 (2) goroutine,轻量级线程,可实现大并发处理,高效利用多核。 (3) 基于 CPS 并发模型(Communicating Sequential Processes )实现
-
吸收了管道通信机制,形成 Go 语言特有的管道 channel 通过管道 channel , 可以实现不同的 goroute 之间的相互通信。
-
函数可以返回多个值。举例: //写一个函数,实现同时返回 和,差 //go 函数支持返回多个值 func getSumAndSub(n1 int, n2 int) (int, int ) { sum := n1 + n2 //go 语句后面不要带分号. sub := n1 - n2 return sum , sub }
-
新的创新:比如切片 slice、延时执行 defer
2.可执行文件创建
在.go文件 go build -o 文件名.exe 目标文件.go
3.转义字符
\r回车,从当前的最前面开始输出,覆盖掉以前的内容
ps:两个go文件都在main包中,即同一个包,需要新建一个文件夹作为包
虽然是main,内容不同
4.注释
在 Golang 中注释有两种形式
// 注释内容
基本语法
/*
注释内容
*/
5.代码规范
5.1 正确的缩进和空白
1) 使用一次 tab 操作,实现缩进,默认整体向右边移动,时候用 shift+tab 整体向左移
看老师的演示:
2) 或者使用 gofmt 来进行格式化 [演示]
gofmt -w 文件名.go
3) Go 语言的代码风格.
package main
import "fmt"
func main() {
fmt.Println("hello,world!")
}
上面的写法是正确的.
package main
import "fmt"
func main()
{
fmt.Println("hello,world!")
}
上面的写法不是正确,Go 语言不允许这样编写。 【Go 语言不允许这样写,是错误的!】
Go 设计者思想: 一个问题尽量只有一个解决方法
go 程序区分大小写 go 的语句后,不需要带分号 go 定义的变量,或者 import 包,必须使用,如果没有使用就会报错 go 中,不要把多条语句放在同一行。否则报错 go 中的大括号成对出现,而且风格
6.Dos的常用指令
6.1dos的基本介绍
Disk Operating System磁盘操作系统
6.2 dos的基本操作原理
6.2.1 目录操作
-
查看当前目录是什么 dir
-
切换到其他盘,比如f盘 cd /d f:
-
切换到当前盘的其他目录下 (使用相对路径和绝对路径演示) 案例演示:
-
切换到上一级:cd ..
-
新建目录(make directory):md 目录名
-
删除目录 删除空目录:rd 目录名
7.变量
7.1变量
1.变量表示内存中的一个存储区域
2.该区域有自己的名称(变量名)和类型(数据类型)
3.golang变量的三种方式
-
指定变量类型,声明后若不赋值,使用默认值
-
根据值自行判定变量类型
-
省略var,注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误
4.多变量声明
在编程中,有时我们需要一次性声明多个变量,Golang也提供这样的语法
5.一次性声明多个全局变量(函数外部声明的变量)
6.变量使用的注意事项
该区域的数据值可以同一类型范围内不断变化
变量在同一个作用域内不能重名
变量=变量名+值+数据类型
Golang的变量如果没有赋初值,编译器会使用默认值
7.2 变量的数据类型
Go 的基本类型有
bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // uint8 的别名 rune // int32 的别名 // 表示一个 Unicode 码点 float32 float64 complex64 complex128
本例展示了几种类型的变量。 同导入语句一样,变量声明也可以“分组”成一个语法块。
int
, uint
和 uintptr
在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽。 当你需要一个整数值时应使用 int
类型,除非你有特殊的理由使用固定大小或无符号的整数类型。
int类型
int8 第一位为符号位 -2^7----2^7 -1
int16 -32768~-32767
int32
Golang的整型默认为int
如何在程序查看某个变量的字节大小和数据类型
Golang程序中整型变量在使用时,遵守保小不保大,即在保证程序正确运行下,尽量使用占用空间小的数据类型
bit:计算机的最小存储单位。byte计算机中基本存储单元
float浮点数
var num3 float32 = -123.0000901 var num4 float64 = -123.0000901 fmt.Println("num3=", num3, "num4=", num4) 输出num3= -123.00009 num4= -123.0000901
字符类型
Golang中没有专门的字符类型,如果要存储单个字符,一般使用byte来保存
字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。也就是说对于传统的字符串是由字符组成的,而 Go 的字符串不同,它是由字节组成的。
对上面代码说明
-
如果我们保存的字符在 ASCII 表的,比如[0-1, a-z,A-Z..]直接可以保存到 byte
-
如果我们保存的字符对应码值大于 255,这时我们可以考虑使用 int 类型保存
-
如果我们需要安装字符的方式输出,这时我们需要格式化输出,即 fmt.Printf(“%c”, c1).
字符类型使用细节
-
字符常量是用单引号('')括起来的单个字符。例如:var c1 byte = 'a' var c2 int = '中' var c3 byte = '9'
-
Go 中允许使用转义字符 '\’来将其后的字符转变为特殊字符型常量。例如:var c3 char = ‘\n’ // '\n'表示换行符
-
Go 语 言 的 字 符 使 用 UTF-8 编 码 , 如 果 想 查 询 字 符 对 应 的 utf8 码 值 查看字符编码(UTF-8) 英文字母-1 个字节 汉字-3 个字节
-
在 Go 中,字符的本质是一个整数,直接输出时,是该字符对应的 UTF-8 编码的码值。
-
可以直接给某个变量赋一个数字,然后按格式化输出时%c,会输出该数字对应的 unicode 字符
-
字符类型是可以进行运算的,相当于一个整数,因为它都对应有 Unicode 码.
-
字符型 存储到 计算机中,需要将字符对应的码值(整数)找出来 存储:字符--->对应码值---->二进制-->存储 读取:二进制----> 码值 ----> 字符 --> 读取
-
字符和码值的对应关系是通过字符编码表决定的(是规定好)
-
Go 语言的编码都统一成了 utf-8。非常的方便,很统一,再也没有编码乱码的困扰了
7.3 布尔类型
-
布尔类型也叫 bool 类型,bool 类型数据只允许取值 true 和 false
-
bool 类型占 1 个字节。
-
bool 类型适于逻辑运算,一般用于程序流程控制
7.4 string 类型
字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本
使用注意事项和细节
-
Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本,这样 Golang 统一使用 UTF-8 编码,中文 乱码问题不会再困扰程序员。
-
字符串一旦赋值了,字符串就不能修改了:在 Go 中字符串是不可变的。
-
字符串的两种表示形式 (1) 双引号, 会识别转义字符 (2) 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果
-
字符串拼接方式
-
当一行字符串太长时,需要使用到多行字符串,可以如下处理
7.5 基本数据类型的默认值
在 go 中,数据类型都有一个默认值,当程序员没有赋值时,就会保留默认值,在 go 中,默认值又叫零值
7.6 基本数据类型的相互转换
Golang 和 java / c 不同,Go 在不同类型的变量之间赋值时需要显式转换。也就是说 Golang 中数据类型不能自动转换。
表达式 T(v) 将值 v 转换为类型 T
T: 就是数据类型,比如 int32,int64,float32 等等 v: 就是需要转换的变量
基本数据类型相互转换的注意事项
-
Go 中,数据类型的转换可以是从 表示范围小-->表示范围大,也可以 范围大--->范围小
-
被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化!
-
在转换中,比如将 int64 转成 int8 【-128---127】 ,编译时不会报错,只是转换的结果是按溢出处理,和我们希望的结果不一样。 因此在转换时,需要考虑范围
7.7 练习
7.8 基本数据类型和 string 的转换
方式 1:fmt.Sprintf("%参数", 表达式)
参数需要和表达式的数据类型相匹配 fmt.Sprintf().. 会返回转换后的字符串
方式 2:使用 strconv 包的函数
7.9 string 类型转基本数据类型
使用时 strconv 包的函数,转bool类型
转int类型
PS:在将String类型转成基本数据类型时,要确保String类型能够转成有效的数据,例如不能把“hello”转成一个整数,Golang直接将其转成0,float变成0,bool变成false
输出
“true"可以转为bool
8.指针
1.基本数据类型,变量存的就是值,也叫值类型
2.获取变量的地址,用&
3.指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值。
比如var ptr *int = &num //指针变量ptr
4.获取指针类型所指向的值,使用:*,var ptr * int,使用*ptr获取ptr指向的值
9.值类型和引用类型
5.值类型,都有对应类型,形式为 *数据类型,比如int的对应的指针就是 *int,float32对应的指针类型就是 *float32,依次类推
6.值类型包括,int系列,float系列,bool,string,数组和结构体struct
7.应用类型:指针,slice切片,map,管道chan,interface等都是应用类型
值类型和应用类型区别:
值类型:变量直接存储值,内存通常在栈中分配
引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据,内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,有GC来回收
10.标识符的命名规范
3.18.1 标识符概念
-
Golang 对各种变量、方法、函数等命名时使用的字符序列称为标识符
-
凡是自己可以起名字的地方都叫标识符
3.18.2 标识符的命名规则
-
由 26 个英文字母大小写,0-9 ,_ 组成
-
数字不可以开头。var num int //ok var 3num int //error
-
Golang 中严格区分大小写。 var num int var Num int 说明:在 golang 中,num 和 Num 是两个不同的变量
-
标识符不能包含空格。
3.19 系统保留关键字
3.20 系统的预定义标识符
11.运算符
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等
-
算术运算符
-
赋值运算符
-
比较运算符/关系运算符
-
逻辑运算符
-
位运算符
-
其它运算符
11.1 算术运算符
+, - , * , / , %, ++, -- , 重点讲解 /、%
自增:++ 自减:--
演示 % 的使用特点
// 演示 % 的使用
// 看一个公式 a % b = a - a / b * b
fmt.Println("10%3=", 10 % 3) // =1
fmt.Println("-10%3=", -10 % 3) // = -10 - (-10) / 3 * 3 = -10 - (-9) = -1
fmt.Println("10%-3=", 10 % -3) // =1
fmt.Println("-10%-3=", -10 % -3) // =-1
11.2 算术运算符使用的注意事项
1) 对于除号 "/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃
小数部分。 例如: x := 19/5 ,结果是 3
2) 当对一个数取模时,可以等价 a%b=a-a/b*b , 这样我们可以看到 取模的一个本质运算。
3) Golang 的自增自减只能当做一个独立语言使用时,不能这样使用
4) Golang 的++ 和 -- 只能写在变量的后面,不能写在变量的前面,即:只有 a++ a-- 没有 ++a
--a
5) Golang 的设计者去掉 c / java 中的 自增自减的容易混淆的写法,让 Golang 更加简洁,统一。(强
制性的)
11.关系运算符(比较运算符)
1) 关系运算符的结果都是 bool 型,也就是要么是 true,要么是 false
2) 关系表达式 经常用在 if 结构的条件中或循环结构的条件中