声明:文中文字大部分为原创,图片来源于网络,无任何侵权/盗取目的,如有请找我删除进行维权。
起源/历史介绍:
2007年,谷歌的三维专家觉得现有语言(C++)在构建大型系统时的复杂性、编译构建速度慢以及对并发支持不足感到不便,所以设计一种新语言。
go语言的特点:
·语法简介:语法简单,易于学习和使用
·天生支持高并发:通过 goroutines 实现轻量级的线程(协程),通过 channels 实现 goroutines 之间的通信。自己的调度机制(GMP)基于CSP模型。
·跨平台性:生成的是可编译的二进制文件,可以跨平台编译,可以在不同的操作系统和架构上编译和运行。
·垃圾回收:Go 语言有自动垃圾回收机制,减轻了内存管理的负担。
·编译性语言:代码会被编译成机器码,可以在没有运行时解释器的情况下直接在目标机器上运行。
·是态类型语言:变量的类型在编译时确定,有助于编译器进行优化,并在编译期间捕捉潜在的类型错误。
基础语法
1.go变量初始化
:= 与 var 不能同时使用
变量被初始化后不能再次初始化
2.go的常量:
const 声明: const b string = value (其中类型可以省略)
用法:
- 做枚举标识提高可读性:一次定义多个常量,还u可以同时声明多个常量。省略值代表和上行相同
- iota (常量计数器):const出现时iota重置为0,接下来逐行+1;遇到cont接着重置
1 << 2 意思是:1左移2位就是12 2 =4
3.运算符
按位异或:两数为“异”则为1、否则为0;
按位与:两数的二进制都为1则结果为1,否则为0;
按位或:有一个数为1则为1,俩数都为0则为0;
运算符的优先级:
a &^ b 是什么意思?
4.结构体:type balabala struct{
}
两个结构体可以继承
可以使用点号“.”操作符来访问结构体的成员,”.“前可以是结构体变量或者结构体指针
5.数组与切片slice
数组声明:
1.var array = [] int {}
2.array := [] int {}
切片声明:
var slice = [] int {} [元素个数]元素类型,元素具体是什么
slice := []int{} [元素个数]元素类型,元素具体是什么
silce := make([]int,2,3) 切片元素类型,切片初始化长度,切片容量
slice 可以用函数:append()添加元素;
字典
初始化:
- var m = map[int] string {
}
同下
- m := map[int]string{
1 :“hello”
2 :“world”
} - m := make( [int]string ) 注意:[]指的是字典的key,{}指的是字典的value
m[1] = "hello"
m[2] = "world"
6. 条件句、循环
1.for(){
}else{}
2.switch
case1
case2
default
循环语句写法
经典写法:
for i:=0;i<n;i++{
}
语法糖:
for i,v:=range list{ //i代表索引下标,v代表对应的值
跳出循环控制
for i:=0;i<n;i++{
if表达式{
1.continue//跳出当前层循环
2.break//跳出整个循环
}
}
7. 函数
go语言里的参数传递只有值传递;切片表现是应该struct是应该结构,不会被改变;不像数组;
在golāng中函数的参数传递都是值传递,不存在引用传递(区别于c++)
匿名函数可以调用全局变量,外部的变量。不会出现因为某一个函数消失就把某些还需要用的变量消失的情况;非常好!
8. 指针 :
声明指针:var a *int 或者 (创建一个指针变量,不开辟任何空间)
a := new(int) (创建应该指针变量,开辟一个空间,没有存任何值,本身默认为0,当有一个其他变量取地址在赋给a后,*a的值就是这个其他变量的值,a的地址是存放这个其他变量的地址)
a_add = & a
go中指针不允许做+-运算的。只能取地址或者求指向变量的值这两种功能。
9. 方法
方法是一类特殊的函数,方法是绑定在某种类型的变量上的函数,它有一定的约束范
围。而变量的类型不仅仅局限于结构体类型,可以是任意类型,比如it、boo等的
别名类型。
有过c++或者java基础的同学可以这样理解,一个struct加上绑定在这个类型上的方
法就等价于一个类。
10.接口
new( ) 返回的是一个接口的指针,可以实现接口的这个方法;
eg:runner = new(runner)中,返回的是runner的指针,它实现了 c接口的所有方法(本身接口和子接口的方法都实现,且子接口的方法要全部实现,少了也会报错)(具体看接口嵌套的最后一个例子)
断言: value ,ok := x.(T)
eg.
结果为
断言成功(即T类型与x接口类型相同):ok为true,value为接口里那个变量的值!
接口可以做函数参数,返回的就是接口里实现的方法(函数)的计算值;
11.error
Go语言的error其实是一个普通的接口类型,用来表示程序执行过程中的错误信息
以上两者创建error方法不能用来判等;拿出字符串信息比较;
new()出来的error对象尽管传入值相等但是打印出也不相等(因为errors.new()返回的是一个error值的地址,每个对象的地址都不一样)
注:相比较两个error值不能直接比较,应该比较其返回的字符串的值;
为了返回状态码,满足业务需求,所以可以新定义应该error的struct
12.defer 延迟执行
原理:底层是是链表,进入函数时会在表头插入一个节点,函数返回时在链表尾取出节点,所以是先插入的后出,LIFO,先defer的函数后执行。
使用顺序:在return时(正常返回、发生错误返回、发生panic)执行,先return->执行defer函数->得到返回值。
场景使用:
·资源释放:读写完一个文件后,使用defer来确保函数执行完毕时关闭文件,防止资源泄露。
·记录函数执行时间:程序运行过程,无论是正常返回、发生错误返回、发生panic结束,都可以用fefer来计算结束时和函数开始时的时间差,从而计算执行时间。
·错误清理:再函数执行后发生错误后的处理,defer会延迟清理操作,这样发生错误跟清理操作不会冲突。
解锁互斥锁:同上,通过defer再函数返回时对互斥锁解锁,保证了线程安全。
13.recover 和panic
recover是用来捕捉重新运行期间发生的异常(panic),每个recover只对应一个panic,可以配合derfer来延迟函数返回,从而让panic被捕捉。