GO基础知识总结

一:GO关键字25个引导程序整体结构8个关键字:package、import、const、var、func、defer、go、return。声明复合数据结构的4个关键字:struct、interface、map、chan。控制程序结构的13个关键字:if、else;for、 range、break、continue;switch、select、type、case、default、fallthrough;goto。内置数据类型标识符(20个):数值: 整型(12个......
摘要由CSDN通过智能技术生成

一:GO关键字25个

    引导程序整体结构8个关键字:package、import、const、var、func、defer、go、return。

    声明复合数据结构的4个关键字:struct、interface、map、chan。

    控制程序结构的13个关键字:if、else;for、 range、break、continue;switch、select、type、case、default、fallthrough;goto。

    内置数据类型标识符(20个):

          数值:

                整型(12个):byte、int、int8、int16、int32、int64

                                   uint uint8、uint16、uint32、uint64、uintptr

                浮点型:float32    float64

                复数:complex64、complex128

    字符和字符串型: string     rune 

    接口型:error

    布尔型:bool

内置函数(15个):

              make、new、len、cap、append、copy、delete、panic、recover、close、complex、real、image、print、println。

常量标识符(4个):

                 true、false:表示bool类型的两个常亮值。

                 iota://用在连续枚举类型的声明中。

                 nil:  //指针,引用类型的变量的默认值是nil

空白标识符(1个):

                      _

GO操作符47个。

基本类型的可比较性:

  • 布尔值可比较
  • 整数、浮点数、复数值、字符串值
  • 指针值可比较,如果指针指向相同的变量,或者两个指针的值均为nil,则他们相等。
  • 通道值可比较。如果两个通道值是由相同的make函数调用创建的,或者两个值都为nil,则他们相等。
  • 接口值是可以比较的,如果两个接口值具有相同的动态类型和相等的动态值,或者两个值都为nil,则他们相等。
  • 如果结构体的所有字段都是可比较的,则他们的值是可比较的。
  • 如果数组元素类型的值可比较,则数组值可比较。如果两个数组对应的元素相等,则他们相等。
  • 切片、函数、map是不可比较的。

HTTP协议和websocket协议的区别:

较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。

更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。

保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。

更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。

可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。

更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

map的底层原理:

go语言中的map采用的是哈希查找表,由一个key通过哈希函数得到哈希值,64位系统中就生成一个64bit的哈希值,由这个哈希值将key对应到不同的桶(bucket)中,当有多个哈希映射到相同的的桶中时,使用链表解决哈希冲突

根据哈希函数将key生成一个hash值,其中低位hash用来判断桶的位置,高位hash确定在桶中的哪个cell。。每个桶可以存储8对key-value,存储结构不是key/value/key/value...,而是key/key..value/value,这样可以避免字节对齐时的padding,节省内存空间。

当不同的key根据哈希得到的tophash和低位hash都一样,发生哈希碰撞,这个时候就体现overflow pointer字段的作用了。

如果overflow bucket也溢出了呢?那就再给overflow bucket新建一个overflow bucket,用指针串起来就形成了链式结构,map本身有2^B个bucket,只有当发生哈希碰撞后才会在bucket后链式增加overflow bucket。

Golang的map加载因子的公式是:map长度 / 2^B 阈值是6.5。其中B可以理解为已扩容的次数。

装填因子是否大于6.5
装填因子 = 元素个数/桶个数,大于6.5时,说明桶快要装满,需要扩容

overflow bucket是否太多
当bucket的数量 < 2^15,但overflow bucket的数量大于桶数量
当bucket的数量 >= 2^15,但overflow bucket的数量大于2^15

双倍扩容:装载因子多大,直接翻倍,B+1;扩容也不是申请一块内存,立马开始拷贝,每一次访问旧的buckets时,就迁移一部分,直到完成,旧bu

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值