202101-03 [典藏版]Golang三色标记、混合写屏障GC模式图文全分析 NEW 概要Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的STW(stop the world),STW的过程中,CPU不执行用户代码,全部用于垃圾回收,这个过程的影响很大,Golang进行了多次的迭代优化来解决这个问题,本文将逐步推进Golang中GC的每次推进,来理解Gc的原理。文章较长,内容概要如下:G0 V1.3之前的标记-清除(mark and sweep)算法Go V1.3之前的标记-清扫(mark and s... Read More >
202101-02 内存分配逃逸分析 NEW 堆栈内存分配中的堆和栈 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆栈缓存方式 栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。 堆... Read More >
202101-01 深入理解GC原理 NEW 垃圾定位算法(1)引用计数法 (Reference Counting)。 如 python php 通常C++通过指针引用计数来回收对象,但是这不能处理循环引用,原理是在每个对象内部维护一个引用计数,当对象被引用时引用计数加一,当对象不被引用时引用计数减一。当引用计数为 0 时,自动销毁对象。 例如:谁想用驴干活的时候,就在驴身上画个... Read More >
202007-26 go语言select详解 select1.1.1. select多路复用在某些场景下我们需要同时从多个通道接收数据。通道在接收数据时,如果没有数据可以接收将会发生阻塞。你也许会写出如下代码使用遍历的方式来实现:for{ // 尝试从ch1接收值 data, ok := <-ch1 // 尝试从ch2接收... Read More >
202007-25 go定时器 定时器1.1.1. 定时器Timer:时间到了,执行只执行1次package mainimport ( "fmt" "time")func main() { // 1.timer基本使用 /... Read More >
202007-24 go goroutine池 Goroutine池1.1.1. worker pool(goroutine池)本质上是生产者消费者模型可以有效控制goroutine数量,防止暴涨需求:计算一个数字的各个位数之和,例如数字123,结果为1+2+3=6随机生成数字进行计算控制台输出结果如下:package mainimport ( "fmt" "math/ran... Read More >
202007-23 go channel Channel1.1.1. channel单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信。如果说goroutine是G... Read More >
202007-22 go runtime包 runtime包1.1.1. runtime.Gosched()让出CPU时间片,重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤,但是你妈让你去相亲,两种情况第一就是你相亲速度非常快,见面就黄不耽误你继续烧烤,第二种情况就是你相亲速度特别慢,见面就是你侬我侬的,耽误了烧烤,但是还馋就是耽误了烧烤你还得去烧烤)package mainimport ( "fmt" ... Read More >
202007-21 Goroutine Goroutine在java/c++中我们要实现并发编程的时候,我们通常需要自己维护一个线程池,并且需要自己去包装一个又一个的任务,同时需要自己去调度线程执行任务并维护上下文切换,这一切通常会耗费程序员大量的心智。那么能不能有一种机制,程序员只需要定义很多个任务,让系统去帮助我们把这些任务分配到CPU上实现并发执行呢?Go语言中的goroutine就是这样一种机制,goroutine的概念类似于线程,但 goroutine是由Go的运行时(runtime)调度和管理的。G... Read More >
202007-20 go并发介绍 并发介绍进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 C.一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。并发和并行  ... Read More >
202007-19 go-websocket编程 WebSocket编程1.1.1. webSocket是什么WebSocket是一种在单个TCP连接上进行全双工通信的协议WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输需要安装第三方包:cmd中:go get -u -v github.com/gorilla/websocket1.1.2. 举个聊天室的小例子在... Read More >
202007-18 go-http编程 http编程1.1.1. web工作流程Web服务器的工作原理可以简单地归纳为客户机通过TCP/IP协议建立到服务器的TCP连接客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果1.1.2. HTTP协议超文本传输协议(HTTP,Hype... Read More >
202007-17 go-tcp黏包 TCP黏包服务端代码如下:// socket_stick/server/main.gofunc process(conn net.Conn) { defer conn.Close() reader := bufio.NewReader(conn) var&nb... Read More >
202007-16 go-udp编程 UDP编程1.1.1. Go语言实现UDP通信UDP协议UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。UDP服务端使用Go语言的net包实现的UDP服务端代码如下:// UDP/ser... Read More >
202007-15 go-tcp编程 TCP编程1.1.1. Go语言实现TCP通信TCP协议TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。TCP服务端一个TCP服务端可以同时连接很多个客户端,例如世界各地的用户使用自己电脑上的浏览器访问淘宝网。因为Go语言中... Read More >
202007-14 go-socket编程 socket编程Socket是BSD UNIX的进程通信机制,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。电脑上运行的应用程序通常通过”套接字”向网络发出请求或者应答网络请求。1.1.1. socket图解Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门面模式,它把复杂的TC... Read More >
202007-13 go网络编程-互联网协议介绍 互联网协议介绍互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网。我们理解了这些协议,就理解了互联网的原理。由于这些协议太过庞大和复杂,没有办法在这里一概而全,只能介绍一下我们日常开发中接触较多的几个协议。1.1.1. 互联网分层模型互联网的逻辑实现被分为好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。用户接触到的只是最上面的那一层,根本不会感觉到下面的几层。要理解互... Read More >
202007-12 go面向对象-接口 接口接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。1.1. 接口1.1.1. 接口类型在Go语言中接口(interface)是一种类型,一种抽象的类型。interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。为了保护你的Go语言职业生涯,请牢记接口(... Read More >
202007-11 go面向对象-匿名字段 接口go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段package mainimport "fmt"// go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段//人type Person struct { name string  ... Read More >
202007-10 go自定义error 自定义error1.1. 抛异常和处理异常1.1.1. 系统抛package mainimport "fmt"// 系统抛func test01() { a := [5]int{0, 1, 2, 3, 4} a[1] = 123  ... Read More >