go语言学习笔记

Go语言学习

基本类型

Bool 取值范围:true,false (不可以用数字代替)

Int/uint 根据平台可能为32或64位

int8/uint8 长度:1字节 取值范围-128~127/0~255

byte(uint8别名)

int16/uint16 int32/uint32 int62/uint64

float32/float64 长度:4/8字节 小数位:精确到7/15小数位

复数:complex64/complex128 长度:8/16字节 足够保存指针的32位或64位整数型

零值是变量的默认值

在submit里面ctrl+b是打开我们的测试窗口,go run 是运行程序

Go语言中只能显示转换<valueA> [:]=<TypeOfValueA>(<ValueB>)

浮点型和布尔型不能进行转换

string转换为int类型 var valueA, _ = strconv.Atoi(ValueB)

Int类型转换为string类型 valueA:= strconv.Itoa(ValueB)

  1. #string到int
  2. int,err:=strconv.Atoi(string)
  3. #string到int64
  4. int64, err := strconv.ParseInt(string, 10, 64)
  5. #int到string
  6. string:=strconv.Itoa(int)
  7. #int64到string
  8. string:=strconv.FormatInt(int64,10)

Go中有指针

采用”.”选择符来操作指针目标对象的成员

操作符”&”取变量地址,使用”*”通过指针间接访问目标对象

默认值为nil不是null

If语句中大括号必须跟在条件语句后面,条件语句可以没有括号,可以在条件语句中可以声明变量

For语句 for{} 无限循环 for i:=0;i<3;i++ {} 经典模式

Switch 支持任何类型或表达式的条件语句,不需要break,符合条件自动跳出,如需要继续执行下一个case,需要使用fallthrough语句,支持初始化表达式,右侧需跟分号,做大括号必须和条件语句在同一行。

Goto break和continue会与标签结合使用,否则break只会跳出本次循环

数组 var a [2]int //长度为2的int型数组

没有赋值,则默认的值为零;string默认为空

a :=[2]int{1} //数组的第一个数为1,第二个为默认0

a :=[20]int{19:1} //添加索引,第二十个元素为0,其他为0

a :=[…]int{1,2,3,4,5} //长度为5的数组

a :=[…]int{19:1} //索引20元素为1,其他为零,数组长度为20

数组指针 a := […]int{19:1}

Var p *[100]int= &a //p位数组a的地址

指针数组 x,y=1,2

a:=[…]int{&x,&y} //a输出的是x,y的地址

数组之间可以进行==和!=的比较

切片Slice

本身不是数组,它指向底层的数组

可以直接创建或从底层数组获取生成

len()获取元素个数,cap()获取容量,make()创建,如果多个slice指向相同底层数组,其中一个的值改变会影响全部

make([]T,len,cap) 如果cap省略,则和len的值相同

var a=[]int //切片的定义

a:=[10]int

s1:=a[5:] //切片s1取数组a索引5到最后的元素

s1:=a[:5]//s1取数组a索引0到5的元素

s1:=a[3:9] //s1取数组a索引3到9的元素

s1 :=make([]int,3,6) //定义s1切片,长度为3,容量为6

s1=append(s1,1,2,3) //利用append函数为切片s1追加元素1.2.3

map

var m map[int]string //map定义

m=make(map[intstring]) //初始化

m[1]=”ok” //赋值

a :=m[1] //取值

delete(m,1) //删除值

多重map嵌套,需要第二层的进行初始化

var m map[int]map[int]string

m=make(map[int]map[int]string)

m[1]=make(map[int]string) //对于key为1 进行初始化

m[1][1]=”ok”

a:=m[]

range 迭代函数

sort.Ints(s) 排序

对map的间接排序

m :=map[int]string{1:”a”,2:”b”,3:”c”,4:”d”,5:”e”} //建map

s:=make([]int,len(m))//建slice

i:=0

for k,_:=range m{ //迭代取出每一个key的值,存到slice中

s[i]=k

i++

}

Sort.Ints(s) //对slice排序

Go 函数 不支持 嵌套、重载和默认参数

无需声明原型、不定长度变参、多返回值、命名返回值参数

匿名函数、闭包

defer

在函数体执行结束后

按照调用顺序的相反顺序逐个执行

即使函数发生严重错误也会执行

支持匿名函数的调用

常用于资源清理、文件关闭、解锁以及记录时间等操作

通过与匿名函数配合可在return之后修改函数计算结果

如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer

时即已经获得了拷贝,否则则是引用某个变量的地址

Go 没有异常机制,但有 panic/recover 模式来处理错误

Panic 可以在任何地方引发,但recover只有在defer调用的函数中有效

结构体

Go 中的struct与C中的struct非常相似,并且Go没有class

使用 type <Name> struct{} 定义结构,名称遵循可见性规则

支持指向自身的指针类型成员

支持匿名结构,可用作成员或定义成员变量

匿名结构也可以用于map的值

可以使用字面值对结构进行初始化

允许直接通过指针来读写结构成员

相同类型的成员可进行直接拷贝赋值

支持 == 与 !=比较运算符,但不支持 > 或 <

支持匿名字段,本质上是定义了以某个类型名为名称的字段

嵌入结构作为匿名字段看起来像继承,但不是继承

可以使用匿名字段指针