设为首页 加入收藏

TOP

第一篇博客 golang杂谈
2017-09-30 13:22:23 】 浏览:1245
Tags:第一篇 博客 golang 杂谈
1 go语言的优势和缺陷
优势:
1 开发速度很快,代码比较简洁.
2 标准库比较强大
3 单元测试方便
缺陷:
1 垃圾回收
2 chan有缓冲和无缓冲实现原理
同步和异步关键在于缓冲槽
3 gc原理
三色标记法 STW
  1. 初始化所有对象为白色
  2. 扫描指定内存区域,将可达对象标记为灰色,并存入队列
  3. 从队列中取出灰色对象,将其引用对象标记为灰色,存入队列,自身标记为黑色
  4. 写屏障监控内存对象修改,重新标色或放回队列
4 golang的chan和共享内存
通过共享内存进行通信:不同的请求方请求同一块内存从而实现数据交互,为了防止在请求A正在修改该内存块中的数据时请求B也对其进行修改,因此需要锁的机制
通过chan进行通信(通过通信来共享内存):goroutine A和goroutine B二者的内存不能互相访问,而是通过操作数据队列channel C,并且这个 channel C的存取能在语言底层层面配合 goroutine 的调度,不需要你手动额外加锁,避免了额外的锁开销,其实这个channel C也相当于一块共享内存,由goroutine A和goroutine B共享
 
5 golang 变量的内存分配:
在go里面内存是分配在堆上还是栈上由编译器决定,并不是用了new函数就一定会在堆上分配内存,既是是相同的源码,也有不同的结果
同样的源码,在禁用内联优化的情况下,会在堆上分配
  • go build -gcflags "-l" -o test test.go 关闭内联优化
  • go tool objdump -s "main\.test" test
在使用默认的参数时,函数test被内联优化,结果没有在堆上分配
    • go build  -o test test.go 使用默认参数
    • go tool objdump -s "main\.test" test
defer
在执行defer的时候、需要注意注册和调用,defer会首先注册函数,函数参数在这一步生成,在调用defer的函数退出前一步,调用defer(deferproc)。如果该调用函数有返回值,需要注意return不是一个原子指令,它的步骤是先生成一个返回值,然后执行返回(returnproc),而defer的调用会在这二者之间
method 
    继承和重写

向已经关闭的chan中传递数据

引发panic 
从已关闭接收数据,返回已缓冲值或零值
无论收发,nil通道都会阻塞

 什么情况下考虑使用消息队列(消息队列的应用场景)
消息队列有自己的一定的特性:异步/顺序读写/高性能/协议简单。所以一般会用于解决大量的服务器端异步请求,同时可以实现服务端的负载均衡和业务的容灾。
 
什么情况下考虑使用缓存、redis有多少种持久化的方式、redis分片
持久化方式:在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成后续工作,可以避免服务进程操作IO
redis持久化机制:
  1. RDB持久化: 在指定时间间隔内将内存中的数据集快照写入磁盘
  2. AOF持久化:以日志形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的
 
TCP和UDP区别
  • 1、基于连接与无连接。
  • 2、TCP要求系统资源较多,UDP较少。
  • 3、UDP程序结构较简单。
  • 4、流模式(TCP)与数据报模式(UDP)。
  • 5、TCP保证数据正确性,UDP可能丢包。
  • 6、TCP保证数据顺序,UDP不保证。
  • 7、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
  • 8、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
  • 9、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。
  • 10、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
  • 11、TCP首部开销20字节;UDP的首部开销小,只有8个字节。
  • 12、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
 
HTTP状态码说明
 
io状态监控
iostat:用于监控系统设备的IO负载情况,

iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

数组和切片的区别

  • 数组在元素类型相同的情况情况下,可以相互比较。切片不能相互比较,只能返回是否为nil
  • 数组复制和传参操作都会复制整个数组数据,切片是引用类型,不会复制
  • 数组的长度固定,切片使用的make函数允许在运行期指定数组长度
goroutine和线程的区别
goroutine比线程开销更小
  • 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 
  • 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 
  • 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
goroutine原理:
goroutine并发调度通过三个基本对象的相互协作来实现在用户空间管理和调度并发任务,三个基本对象分别是:
P(Processor),其作用是类似于CPU核,用来控制可同时并发执行的任务数量。每个工作线程都必须绑定一个有效P才被允许执行任务,否则只能休眠,直到有空闲P被唤醒,P还为线程提供执行资源,比如对象内存分配,本地任务队列等。线程独享所绑定的P资源,可以在无锁状态下执行高效操作。
G(Goroutine),创建并发任务,保存并发任务状态,为任务执行提供所需栈内存空间。G任务创建后被放置在P本地队列或全局队列,等待工作线程调度执行。
M,系统线程,M是实际执行体,它和P绑定,以调度循环方式不停执行G并发任务
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇我学习go的五个感悟(译) 下一篇Go 数据结构--二分查找树

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目