记录一些golang有关的知识点,主要是一些golang特有的
定义变量,常量
变量
1.声明变量
var 变量名称 类型
命名规则
不能以数字开头
区分大小写
驼峰规则
变量声明后没有初始化的话 值为空
2.初始化变量
第一种初始化变量
var username string
username="zz"
第二种
var username string = "zz"
第三种
var username ="zz"
3.一次声明多个变量
var 变量名称 变量名称 类型
var (
变量名称 类型
变量名称 类型
)
4.短变量声明
只能局部变量 不能全局变量声明
类型不一致没关系
username := "zz"
a,b := 20, 30
5.匿名变量
不占空间 不存在重复声明
常量
const pi=3.14159
const iota(计数器)
const a=iota //a=0
const{
b=iota
c
d//-(跳过一个值)
e
}
0,1,2,3/0,1,3
***声明中插队***
const{
b=iota//0
c=100//100
d=iota//2
e//3
}
***多个定义在一行***
const{
a,b=iota+1,iota+2 //1,2
c,d //2,3
e,f //3,4
}
示例
print/printf/println
print 不换行 不空格
println 换行 空格
printf 格式化输出 ("%v",a)
var a int =10
fmt.println("a=",a)
fmt.printf("a=%v\n",a)
fmt.printf("a=%v" a的类型是%T",a,a)
数据类型
整型
整型分为 有符号整型 无符号整型
与其他语言一致
浮点型
有float32/64
默认使用float64 保留6位
会出现精度缺失的现象
科学计数法
var f2=3.14e2 //3.14*10^2
字符串
多行字符串
示例
主要操作
len 求长度
fmt.Sprintf 拼接字符串/+
fmt.Sprintf("%v %v",str1,str2)
strings.Split 分割 strings 需要引入strings包
strings.Split(str1,"-") 切片
strings.Join(str1,"-") 把切片连接成字符串
strings.contains 判断是否包含
strings.HasPrefix /HasSuffx 前后缀判断
strings.Index(),strings.LastIndex() 子串出现的位置 前/后
示例
布尔型
布尔型
整型不能转换为布尔类型
布尔类型无法参与数值运算
var s="sssss"
if s {
fmt.printf("true")
}//报错
示例
类型转换
流程控制
if,for
for range, swirch case
数组
切片
声明及初始化
是引用类型 包括地址、长度、容量;默认值为nil
声明
var arr1 []int //不推荐
初始化
var arr2 = []int{1,2,3,4}
var arr3 = []int{1: 2,2: 4,3: 6}//前一个表示位置,后一个表示值
示例
切片的循环遍历
基于数组的切片
a :=[数组个数]int{}
b :=a[:] //获取数组里面所有的值
示例
基于切片的切片
a :=[]string{}
b :=a[1:]
示例
切片的长度和容量
切片的长度是就是它包含的元素个数
切片的容量就是从它的第一个元素开始数,到其底层数组元素末尾的个数
分别可以用len(),cap()获取
示例
make函数创建一个切片
var 切片名 = make([]类型,长度,容量)
示例
append扩容
扩容
append (切片名,扩容量)
合并
切片名 = append(切片名,切片名1...)//必须要有...
示例
切片扩容的策略
copy函数复制一个切片
copy(切片名1,切片名2) //切片名2复制到1中
示例
删除切片元素
golang中没有删除切片元素的专用方法,可以通过再切片和合并的方法实现
示例
切片的排序
选择排序
冒泡排序
sort包排序
1.对于int,float64和string数组或是切片的排序,
有sort.Ints(),sort.Float64s()和sort.strings()函数
默认从小到大排序
示例
map
map是一种无序的基于key-value的数据结构,map是引用数据类型,必须初始化
map[KeyType]ValueType //KeyType表示键的类型,ValueType表示键对应的值的leixing
初始化
map类型的变量默认初始值为nil,需要使用make()函数来分配内存
var map类名 = make(mapKeyType]ValueType)
示例
声明时填充元素
修改map类型
在map中存放一系列属性,把map类型值定义为切片
元素为map类型的切片
for range循环遍历map类型
以关键字key循环遍历map类型
指针,make,new
函数
函数定义
func 函数名(参数 (变量名,类型))(返回值){} 类型一样可省略前面的
函数变量
可变参数
函数返回值
return关键字一次返回多值
返回值命名,并在函数体中直接使用
函数作为另一个函数参数
这里用到的是type定义一个函数类型
type 函数类型名(int,int)int
函数作为另一个函数返回值
匿名函数
func (参数)(返回值){
函数体
}
函数递归
闭包
1.闭包是指有权访问另一个函数作用域中的变量的函数
2.创建闭包的常见的方式是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量
写法: 函数里嵌套函数,最后返回里面的函数
func adder()
作用就是定义一个变量既常驻内存又不污染全局
defer,panic/recover
defer
defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序执行。
panic/recover
go语言中目前没有异常机制,使用panic和recover模式处理错误
注意panic在任何地方都可生效,但recover只能在defer中有效
抛出异常,停止执行
抛出异常,继续执行
结构体
结构体定义
type 类型名 struct{
字段名 字段类型
字段名 字段类型
...
}
结构体实例化
第一种方法
第二种方法(new关键字)
第三种方法(&)
第四种方法(键值对初始化)
第五种方法
第六种方法(有些不赋值)
第七种方法(使用值的列表初始化)
结构体方法
结构体是值类型
func(接受者变量 接受者类型)方法名(参数列表)(返回参数){
函数体
}
//接受者变量 命名时第一个字母小写
修改结构体属性
结构体匿名字段
可以不写字段名
嵌套结构体
嵌套匿名结构体
结构体继承
接口
接口定义
type 接口名 interface{
方法名1(参数列表1)返回值列表1
方法名2(参数列表2)返回值列表2
}
空接口
定义
不定义任何方法的接口,可以接受任何类型的接口
空接口也可以直接当做类型使用
空接口作为函数的参数
map的值实现空接口
类型断言
判断空接口中的类型
x.(T)
结构体值接受者和指针接受者实现接口的区别
值接收者
如果结构体中的方法是值接受者,那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
指针接收者
如果结构体中的方法是指针接受者,那么实例化后的结构体指针类型可以赋值给接口变量,结构体值类型不能赋值给接口变量
结构体实现多接口
接口嵌套
goroutine channel 并发和并行
主要通过多协程实现
并行
协程
go 来实现