Go语言笔记
Erick_Lv
菜鸡互啄
展开
-
Golang的GC和内存逃逸
简介每个版本的Golang的垃圾回收都在不断优化中,而且方法和策略都在变化,因此这里只是总结出以下几个关键点:什么样的数据需要GC触发GC的条件是什么GC时发生了什么能否从代码层面上提高GC的效率GC的基本流程Golang在确定的时间,或者内存分配到达一定程度时,进行GC。GC时,会停止STW(Stop The World),即对外的服务都会暂停,然后进行垃圾回收处理。Go1.1...原创 2020-03-01 22:35:58 · 2079 阅读 · 0 评论 -
Golang的协程调度
调度的基础,模型关系的映射GPM模型:G,Goroutinue被调度器管理的轻量级线程,goroutine使用go关键字创建调度系统的最基本单位goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等。默认的大小是2KB,根据需要逐步上涨。G绑定到P上执行P,Processor逻辑执行单元存储了M执行的上下...原创 2020-03-01 20:33:17 · 1218 阅读 · 0 评论 -
slice和map的高级主题
slice基础的内存模型:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4eCAPE8-1583047423727)(en-resource://database/904:1)]传入一个slice占用24字节,分别是ptr、len和cap,分别一个字节。append会再slice后面追加元素,具体参考代码1cap没满的情况下,直接在后面的内存上追加数...原创 2020-03-01 15:24:25 · 238 阅读 · 0 评论 -
Golang结构体与面向对象
结构体和内嵌类型结构体是Golang中面向对象的核心,Golang允许内嵌类型,内嵌可以理解为使用组合来实现继承,给出代码示例:package mainimport "fmt"type SmallFoo struct { name string money float64}func (smallFoo *SmallFoo) Talk() { fmt.Print...原创 2019-11-28 19:13:07 · 429 阅读 · 0 评论 -
Goroutine心跳检测
Goroutine心跳检测心跳检测的核心思想是,单独启动心跳协程,然后通过向协程发送数据,表示心跳。package mainimport ( "fmt" "math/rand" "time")func main() { rand.Seed(time.Now().UnixNano()) doWork := func(done <-chan in...原创 2019-11-22 00:25:33 · 861 阅读 · 1 评论 -
Golang slice高级应用
原文参考:https://github.com/golang/go/wiki/SliceTricks代码示例:package mainimport "fmt"func initSliceValue(s []int) { for i := 0; i < len(s); i++ { s[i] = i }}func main() { // App...原创 2019-11-16 16:27:50 · 639 阅读 · 0 评论 -
Golang的context理解
使用方法context用于表示一个请求的上下文。一个网络请求,一般开启一个协程处理,而这个协程内部还会开启其它的协程继续处理。为了传递一个请求在不同协程中的处理情况(比如是否超时等),我们利用context来记录这个情况。同样的,对于一些IO处理,也需要context保存状态,比如超时时间等。context一般用以下两种方式传递:作为函数调用的第一个参数作为一个请求结构体的可选配置f...原创 2019-11-16 16:21:59 · 702 阅读 · 0 评论 -
Golang并发模式--channel高级使用
or-done channel再pipeline的情况中,我们通过done来通知goroutine结束。但是,如果我们处理的channel来自系统其它分散的部分,则无法通过done来控制,因为我们不知道数据流终止的时间,此时需要引入or-done机制。or-done机制本质上是对外界数据channel的一个封装,以便我们可以实际控制。给出代码示例:package mainfunc main...原创 2019-11-16 16:20:51 · 995 阅读 · 1 评论 -
Golang并发模式--扇入、扇出
扇入扇出扇入扇出和pipeline的最大区在于,管线是串行的,但是扇入扇出是并行的。并行是指,一个管线可以接收其它多个数据源的输入,前提是管线对于多个数据源的输入顺序是不敏感的。一个扇入扇出模块示例图如下:输入管线1输入管线2输入管线3输出管线模块A1扇入扇出模块模块A2模块A3接收器给出代码示例:package mainimport ( "fmt" "math/ran...原创 2019-11-16 16:19:18 · 1418 阅读 · 0 评论 -
Golang并发模式--管线
管线管线的作用类似于linux的管道,我们利用channel把数据一级级的传递,最终获取数据的结果。管线适用于流处理的方式,而非批处理;流处理可以实时的获取数据。给出最基础的管线示例,串联加法器和乘法器的管线。管线1管线2管线3数据生成器加法器B乘法器数据获取器我们使用channel来表示图中的管线。给出代码示例:package mainimport ( "fmt" ...原创 2019-11-16 16:18:15 · 271 阅读 · 0 评论 -
Golang并发模式基础
for-select循环最基本的模式:for { select { case condition 1: // ... case condition 2: // ... case condition n: // ... default: // ... }}每个condition都...原创 2019-11-16 16:15:38 · 272 阅读 · 0 评论 -
Golang并发编程组件
选择channel和互斥量我们一般根据以下原则选择:YNYNYNYN性能要求很高的临界区使用传统的锁转让数据所有权使用channel保护结构的内部状态协调多个逻辑片段协程简介golang的协程模型,是基于M->N的绿色协程映射的。意思是有M个编程语言级别的绿色线程,运行在N个操作系统的线程上,操作系统的线程调度绿色线程,所以M≥NM\ge NM≥N。之后,协程运行在这些绿色线程上,协...原创 2019-11-16 15:45:17 · 175 阅读 · 0 评论 -
Golang错误处理机制
基础错误处理应该时工程的一部分,Golang中的error是一个interface类型,如下:type error interface { Error() string}凡是实现Error()方法的结构,都可以作为错误处理。工程中的方法...原创 2019-10-15 23:26:17 · 470 阅读 · 0 评论 -
Golang的4种传递引用类型
Go语言有4中类型是传递引用的,这在赋值或者作为函数传参数时,都是浅拷贝,分别是:interfaceslicemapchan下面给出代码详细说明:package mainimport "fmt"type Foo interface { foo() setName(string)}type MyFoo struct { name string}func (m...原创 2019-10-11 10:39:40 · 2273 阅读 · 0 评论 -
Golang的工程管理
包管理包管理是golang大型工程开发的基础,golang的一个完整的工程应该分为3个模块,分别是:src:所有的源代码,必须自己组织创建pkg:源代码编译成的二进制的包,自动生成bin:最终的可执行程序,自动生成。main函数所在的那个文件的包。golang有两个路径,名称和作用分别是:GOROOT:golang安装的位置,这是安装的时候自动添加的,类Unix系统下通过expo...原创 2019-03-31 19:42:56 · 545 阅读 · 0 评论 -
Golang的socket一般使用方式
参考:https://astaxie.gitbooks.io/build-web-application-with-golang/zh/08.1.html客户端操作步骤: - 确定服务器的IP和端口号 - 建立TCP连接 - 向服务器发送请求 - 接收请求服务端操作步骤: - 确定监听的端口号 - 启动TCP监听 - 接收客户端的请求 - 返回数据(...原创 2018-09-12 20:45:57 · 2010 阅读 · 0 评论 -
Golang的cookie
一般的写入和读取就使用下面的方式:import ( "fmt" "net/http")func setCookueHandler(w http.ResponseWriter, r *http.Request) { c1 := http.Cookie{ Name: "first_cookie", Value: &qu原创 2018-09-11 22:01:43 · 1183 阅读 · 0 评论 -
Golang连接使用MySql5.7数据库完整步骤
创建数据库、用户以及修改密码在终端中输入命令,启动数据库:service mysql start以下是在MySql中执行的操作。 为防止修改系统的数据库,我们需要新建一个新的数据库:CREATE DATABASE test_db;切换到新建的数据库:use test_db;在该数据库中新建一个表单,其中uid是自动增长的主键:CREATE TABLE &quot;use...原创 2018-09-11 11:50:52 · 2367 阅读 · 0 评论 -
1. Go语言顺序程序设计,错误处理
变量声明Go语言的变量声明需要类型后置var v1 intvar v2 stringvar v3 [10]int // 数组var v4 []int // 数组切片初始化和赋值var v1 int = 10 // 显式说明,同时赋值var v2 = 10 // 自动推导v3 := 10 // 自动推导变量声明和赋...原创 2018-08-17 19:29:16 · 207 阅读 · 0 评论 -
Go语言的flag库、os库、strconv库
flag库的用法直接解析数据根据需要传入的数据类型,直接进行数据解析。从左到右依次是:解析的命令、默认值、说明。代码实例:package mainimport ( "flag" "fmt")func main() { wordPtr := flag.String("word", "foo", "a string") numbPtr := f...原创 2018-08-17 20:48:20 · 242 阅读 · 0 评论 -
Golang的time包的应用
使用time包实现定时After函数类型的channel,输入值是间断时间,返回一个chan Time类型,注意是只读的。该channel直到到达指定的时间后才写入数据:func After(d Duration) &amp;lt;-chan Time代码实例:package mainimport ( &quot;time &quot;fmt&quot;)func main() { ...原创 2018-08-23 07:26:54 · 283 阅读 · 0 评论 -
Golang处理信号
简介:该包中的所有函数,都是处理os.Signal的,os.Signal用于接受各种类型的信号,比如中断、程序终止等,这些信号的具体作用可以参考:https://golang.org/pkg/os/signal/ 中的介绍。我们根据需要使用中断,可以控制程序运行时间等。函数的使用:func Notify启动一个信号的作用,c不一定是只写的,可以是读写都行的channel,自...原创 2018-08-23 08:01:49 · 1221 阅读 · 0 评论 -
Go语言sync包的Pool和Cond
Poolsync.Pool的作用是存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力,Pool不太适合做永久保存的池,更适合做临时对象池。在Go语言的程序设计中,这是为了缓解高并发是垃圾回收的压力。在并发程序中,sync.Pool会维持一个channel队列,这个队列中的资源的个数是不固定的,并发的goroutine可在该队列中获取资源。我们不知道Pool中资源回收的时...原创 2018-08-27 21:20:52 · 678 阅读 · 0 评论 -
Golang关于channel死锁情况的汇总以及解决方案
直接读取空channel的死锁当一个channel中没有数据,而直接读取时,会发生死锁:func main() { q := make(chan int, 2) &lt;-q}错误提示:fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.m...原创 2018-08-23 16:58:04 · 5370 阅读 · 1 评论 -
Go语言并发编程简介
并发的基础知识进程与线程的回顾总结:进程的定义:进程比较通用的几个定义:进程是程序的一次执行过程进程是一个程序及其数据在处理机上顺序执行时所发生的活动进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位从定义上可以看出,进程实际上是一个过程的描述,它强调运行的程序的这个过程,而不是像程序那样的物理实体。。进程的基本...原创 2018-08-20 20:52:04 · 553 阅读 · 0 评论 -
Golang中闭包的理解
简介参考博客: - https://www.calhoun.io/what-is-a-closure/ - https://www.calhoun.io/5-useful-ways-to-use-closures-in-go/Golang的闭包函数在Golang中是“一等公民”,因此关于函数的特性必须要掌握号,闭包可以看成函数的告诫应用,是Golang高级开发的必备技能。匿...原创 2018-08-24 12:07:53 · 23937 阅读 · 3 评论 -
Golang闭包的典型应用
简介:参考博客: - https://www.calhoun.io/5-useful-ways-to-use-closures-in-go/隔离数据使用这种方式可以隔离不想让调用者的数据,输出指定的结果;或者我们想要计算函数调用的次数。 函数计数器:// 函数计数器func counter(f func()) func() int { n := 0 r...原创 2018-08-24 13:18:38 · 4097 阅读 · 0 评论 -
Golang的并发模式
简介主要学习3个在工程中常用的并发包,同时学习这些包常用的情景模式。runnerrunner可以给一组任务进行顺序分配,然后进行总体的时间限制。该方式确定了任务的顺序后,可以让任务顺序执行,直到时间限制到了或者任务完成或者人为中断。本例子中同时允许使用Ctrl+C进行人工中断。runner包源代码分析:package mainimport ( &quot;os&quot; ...原创 2018-08-24 14:15:48 · 1065 阅读 · 0 评论 -
Golang之Channel的理解与应用
博客参考自:https://golangbot.com/buffered-channels-worker-pools/基础应用使用channel的阻塞性质作为延时函数。package mainimport ( &quot;fmt&quot;)func hello(done chan bool) { fmt.Println(&quot;Hello world goroutine !&quot;)...原创 2018-08-21 15:49:40 · 1910 阅读 · 0 评论 -
Go语言struct{}类型的channel
简介在Go语言中,有一种特殊的struct{}类型的channel,它不能被写入任何数据,只有通过close()函数进行关闭操作,才能进行输出操作。。 定义:var sig = make(chan struct{})解除方式:package mainfunc main() { var sig = make(chan struct{}) close(sig)...原创 2018-08-24 22:13:11 · 6527 阅读 · 2 评论 -
Golang的io.go和io.pipe库的笔记
io.go库函数该库函数主要是一些基础的抽象接口,这些接口都是未经过实现的抽象函数。其他的一些标准库使用这些接口完成了一些相关的功能,我们在实际工程中,需要实现这些接口,同时借助其他库函数对这些的接口的扩展,来实现代码的服用。复用接口的本质上是Duck Type,即只要实现了某个接口的所有函数,就可以使用该接口表示一个对象。以下是两个个主要的抽象接口:// Reader接口用于包装...原创 2018-08-24 22:47:39 · 2779 阅读 · 0 评论 -
Go语言常用的并发模式(上)
Confinement该模式用于处理数据限制问题,类似于生产者和消费者模式。使用channel的方式通过共享信息的方式进行。有一个协程专门负责生产,另外一个协程负责接收数据。代码中使用随机的时间模拟实际情况中耗时部分。package mainimport ( &amp;quot;fmt&amp;quot; &amp;quot;math/rand&amp;quot; &amp;quot;time原创 2018-08-29 16:09:09 · 1916 阅读 · 2 评论 -
Go语言面向对象编程
系统类型为类型添加方法Go语言的类型,除了指针之外,都可以组合出自己的方法。type Integer intfunc (a Integer) Less(b Integer) bool { return a &lt; b}func Ingeter_Less(a Integer, b Integer) bool { return a &lt; b...原创 2018-08-19 16:08:39 · 834 阅读 · 0 评论