Golang基础学习整理

9 minute read
  1. iota iota是golang的一个关键字,此关键字用来声明enum的时候采用,默认从0开始,每遇到一个类似const就会重置为0。
  2. 通过开头字母大小写来实现变量和函数的公有私有。例:
1//公有
2var Name string
3//私有
4var name string
  1. 将数组作为函数参数进行传递时,实际传入的是该数组的副本。
  2. 由于初始化数组时无法预知定义多大的空间,就需要使用类似动态数组的结构,go语言中采用slice来实现数组的切片,类似python中的切片, slice是一个引用类型,它总是指向一个底层的arrayslice的声明类似array,只是不需要长度。当引用改变其中的元素时,其他所有的引用也会相应改变。 常用内置函数: len获取长度,cap获取容量,append追加元素,并返回一个和slice一样类型的slicecopy函数从源slicesrc中复制元素到目标dst,并且返回复制的元素个数。
  3. map类似python中的字典,格式为map[keyType]valueType。map无序,必须通过key去获取。长度不固定,是一种引用类型。len函数 map不是安全的,在多个goroutine中使用时必须使用mutex lock
  4. make用于内建类型(map,slice,channel)的内存分配。new用于各种类型的内存分配。
  5. go中switch默认相当于每个case后面都加了break。但是可以通过加fallthrough强制执行后后面的代码。
  6. main函数和init函数,在定义时不能有任何参数和返回值。
  7. 导入包时加前缀_是为了引入该包,而不直接使用包里面的函数,只是调用包中的init函数。
  8. interface是一组method签名的集合,可以通过interface来定义对象的一组行为。若某个对象实现了某个接口的所有方法,那么这个对象就实现了此接口。如果定义一个interface的变量,那么这个变量里面可以存实现这个interface的任意类型的对象。空interface可以存储任何类型的数值。 element.(type)只能在switch中使用,其他地方不能使用。
  9. golang中的反射机制,就是能够检查程序在运行时的状态。

函数声明

func 函数名(参数列表)(返回值列表){ //函数体 }

变量声明
  • var 变量名 类型 = 表达式(类型和表达式可以省略其中一个)
  • 多个变量声明: var ( 变量名 类型 变量名 类型 )
赋值

变量 = 表达式 _可以丢弃不需要的值

常量

const 常量名 = 表达式 const( 常量名 类型 常量名 类型 ) 批量声明的常量,除第一个外其它的常量的右边的初始化表达式都可以省略,默认使用前面常量的初始化表达式写法 iota常用语定义枚举值

总结:var 声明变量,const声明常量。声明时可以带类型。也可以不带类型,通过右推断.

位运算
  • & 位与and (左侧和右侧都为1,则为1;否则为0)
  • | 位或 or(左侧或右侧只要有一个为1,结果为1;都为0结果才为0)
  • ^ 位异或 xor (相同为0,不同为1)
  • &^ 位清空and not(右侧是0,左侧数不变;右侧是1,则左侧数清零)
  • << 左移
  • >> 右移
指针

var 变量名 *类型

eg:var ptr [MAX]*int    //指向数组的指针
/*
默认值 nil,没有NULL值
"&"取变量地址,“*”通过指针访问目标对象
不能对指针做加减乘除运算
不存在函数的指针
*/
var ptr *[3]int      //数组指针,保存了一个数组地址
var ptr [3]*int      //指针数组,每元素都是指针
type自定义类型

type 类型名字 底层类型

Switch

只有在case中明确添加fallthrough关键字,才会继续执行下一个case 不带条件表达式的Switchif…else相同,遇到false停止

数组
1var 数组名 [长度]类型
数组切片
1var 数组切片 []类型      //声明无需定义长度

直接创建切片

1make([]Type,len[,cap])

切片可遍历,可修改,不可比较

 1slice.copy(slice1,slice2)    //slice2赋值给slice1
 2```go
 3  包       功能
 4`strings`  提供了字符串查询、替换、比较、截断、拆分和合并等功能。
 5`bytes`    提供了很多与strings包类似的功能。因为字符串是只读的,逐步构建字符串会导致很多分配和复制,这种情况下,使用bytes.Buffer类型将会更有效。
 6`strconv`  提供了布尔类型、整数、浮点数和对应字符串的相互转换,还提供了双引号转义相关的转换。
 7`unicode`  提供了IsDigit、IsLetter、IsUpper和IsLower等功能,用于给字符分类。
 8##### 映射
 9声明:var 映射名称 map[键]值
10只是声明一个map,它的初始值是nil,也就是没有引用任何哈希表。所以不能向一个nil值的map存入元素
11创建:
12```go
13make(map[string]int)
14make(map[string]int,100)  //初始存储能力100
15make(map[string]int{"key":value,"key":value})
16//添加
17Map["key"]=value
18//删除
19delete(map,"key")
20//查看是否存在此key
21if v,ok := Map[key];!ok{
22not key
23}
函数

func 函数名([形参列表])[返回值列表]{ //函数体 }

可变参数

可接收任意数量的该类型参数 func Sum(vals …int)int{ //函数体 }

错误处理

func Foo(参数列表)(res list,err error){ //… } defer通常用于 open/close, connect/disconnect, lock/unlock 等这些成对的操作, 来保证在任何情况下资源都被正确释放

结构体
1type 类型名称 struct{
2//成员列表
3}
方法
1func  (变量名 类型)方法名称( [形参列表] ) [返回值列表]{
2  // 方法体
3}
接口 interface

一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。