Go基础知识点

Go基础知识点

map
  • map是无序的数据集合,从map中取数据的顺序是随机的,因此在做查找时速度快。
  • 函数类型、字典类型、切片类型不能作为key。
  • map 默认并发不安全,多个 goroutine 写同一个 map,引发竞态错误, go run –race 或者go build - race。
  • map 对象即使删除了了全部的 key,但不会缩容空间。
slice
  • slice截取取左不取右;s2:=s[3:4]即取了s中第四个元素,len=j-i=1;cap=k-i=3。
  • 内存开辟空间为容量大小,容量可以进行扩容,如果未超过1024,每次扩容为上次两倍,如果超过1024,为上一次1.25倍。
    切片截取是在源切片基础上进行操作,修改一个会影响另外一个;切片的拷贝不会。
  • append如果超过容量就会变更内存地址 ,如果不超过容量,不变更内存地址。
  • append第二个到第N个参数为元素,使用数组或者切片需要加… , s1 = append(s1,s2…)。
  • copy 返回的是成功拷贝的个数,在第一个结构体数组空间用完或者第二个结构体数组完全复制后会停⽌,较小的数字则为实际copy次数。
  • _, v := range string 中的v类型为rune,rune底层类型为int32,而byte的底层类型为int8,所以可以进行比较,但rune能表示更多的数。
空结构体
  • Golang对于所有的空结构体都返回同一个内存地址,防止内存滥用。空结构体占用0字节,那么空结构体也不需要填充字节。所以空结构体组成的组合数据类型也不会占用内存空间。
  • 有一种特殊的struct{}类型的channel,它不能被写入任何数据,只有通过close()函数进行关闭操作,才能进行输出操作。 struct{}类型的channel不占用任何内存。
类型转换

price := 3.99
weight := 5
//类型转换不会四舍五入
fmt.Println(price * float64(weight)) //16.25
fmt.Println(int(price) * weight) //15
fmt.Println(int(price * float64(weight))) //16

  • float在运算时候依然按照float类型进行运算,在进行赋值时会进行类型转换。 Go不允许在变量之间进行隐式转换,但是对于常量来说规则是不同的。在任何情况下,一个常数x可以转换为T类型。
并发channel
  • close(ch) // 关闭事件会通知到所有等在 ch 上的 goroutine, 不能关闭仅是接收方的 ch。
  • 同时监听多个 channel 或者 避免阻塞在 channel 上,可以配合 select 使用, select 在多个 channel 都满足条件的情况下,随机选择。
  • 无缓冲的channel要求发送和接收必须同时准备好,才能完成发送和接收,属于同步操作,会发生阻塞等待.。
mutex
  • 开箱即用,不用初始化,将并行操作修改为串行操作
  • Mutex不是重入锁,避免多次锁定
  • 推荐使用defer进行解锁
  • 不要解锁未锁定的锁panic
  • 不要重复解锁panic
  • 不要在多个函数间直接传递,值copy以后,即是不同的互斥锁
  • 结构体方法定义的接受对象如果包含了了Mutex,则使用指针值接受对象
  • sync.RWMutex 读写锁
    读读可以并行,读写不能并行
  • sync.WaitGroup
    适合于一对多的 goroutine 的协同等待
    三个方法:Add Done Wait
    底层计数器机制实现,默认值为 0
死锁
  • 当一个channel中没有数据,而直接读取时,会发生死锁。
  • 写入数据超过channel的容量,也会造成死锁。
  • 向已经关闭的channel中写入数据造成的不是死锁,而是产生panic。可以从已经关闭的channel中读取数据。
  • Stop会关闭信号,但不会关闭通道,可能导致死锁。
等待组
  • 如果一个核会按照队列操作 优先执行最后一个 再顺序执行
  • 如果是多核输出顺序随机
  • go 执行是随机的,所以顺序不一定
综合
  • Go语言会自动释放new()动态分配的空间。
  • Golang中switch语句每一个case后面默认跟着break,如果想要继续执行,可以使用fallthrough。
  • 常量不允许寻址。
  • iota常量集相当于枚举,同一行的数值相同。
  • type i8 int8 //如果没有等号 不允许计算
    type i8 = int8 //如果有等号 允许计算
  • 闭包是将函数内部和函数外部连接起来的桥梁,可以读取函数内部的变量,变量的值始终保持在内存中。闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  • :=简写不可用于声明全局变量,只能用于func内。
  • 函数返回参数为一个且不带参数名,可以不写括号。返回参数超过一个或者带参数名则需要用括号扩起+return返回;返回参数不带参数名称时必须显示返回。
  • select中每个 case 必须是一个通信操作,要么是发送要么是接收;如果有同时多个case去处理,比如同时有多个channel可以接收数据,那么Go会伪随机的选择一个case处理(pseudo-random)。如果没有case需要处理,则会选择default去处理,如果default case存在的情况下,否则select语句会阻塞,直到某个case需要处理。
  • chan可以被看成是一个FIFO的消息队列。
  • defer后面的函数在defer语句所在函数执行结束时才调用。
  • fmt.Printf("%T", var_name) //输出变量量类型
    unsafe.Sizeof(var_name) //查看变量量占⽤用字节
  • 反引号,以字符串的原生形式输出,包括换行和特殊字符,可以实现防止攻击、输出源代码等效果。
  • 不推荐使用数组因为其长度固定,不能修改;赋值和函数传递过程是值复制,涉及到内存copy,性能低下。
  • TrimRight 从右侧开始依次扫描是否包含右侧所存在字符,存在则消除,直到碰到第⼀个不存在字符为终结,每个字符消除都会依次检测是否在第⼆个参数中存在,只想删除特定顺序时候使用。TrimSuffix只会删除一次。
  • rune为int32的别名,会⾃自动将字符转换为byte, int32编码的。
  • string类型 可以转成[]byte []rune
  • ⼀个包下不可以有两个相同名称的函数,init函数除外,编译期间,编译器器会用唯一的后缀重写每个init函数的名称。但init函数不可以被显示调用。
  • type 只能用于interface类型的判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值