Golang复习笔记之起源、基础语法

声明:文中文字大部分为原创,图片来源于网络,无任何侵权/盗取目的,如有请找我删除进行维权。

起源/历史介绍:

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被捕捉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值