golang

golang list使用 双层 循环 删除 遍历

人走茶凉 提交于 2020-01-01 15:32:12
queue队列: import ( "container/list" "sync" ) type Queue struct { l *list.List m sync.Mutex } func NewQueue() *Queue { return &Queue{l: list.New()} } func (q *Queue) PushBack(v interface{}) { if v == nil { return } q.m.Lock() defer q.m.Unlock() q.l.PushBack(v) } func (q *Queue) Front() *list.Element { q.m.Lock() defer q.m.Unlock() return q.l.Front() } func (q *Queue) Remove(e *list.Element) { if e == nil { return } q.m.Lock() defer q.m.Unlock() q.l.Remove(e) } func (q *Queue) Len() int { q.m.Lock() defer q.m.Unlock() return q.l.Len() } 这样就基本满足了. 使用过程中, 发现list有个小坑: 遍历的时候不能Remove for e := l.Front(

golang与面向接口编程

前提是你 提交于 2020-01-01 00:41:11
这节不阐述OOP的理念,从接口直接讲,需要一定的抽象思想,新手可以绕道 go里面的接口定义 Go语言不同于其他语言。在Go语言中,接口是自定义类型,用于指定一组一个或多个方法签名,并且该接口是抽象的,因此不允许你创建该接口的实例。但是你可以创建接口类型的变量,并且可以为该变量分配一个具体的类型值,该值具有接口所需的方法。换句话说,接口既是方法的集合,也是自定义类型。 // 定义一个接口 type myinterface interface { // 定义方法名 fun1 ( ) int fun2 ( ) float64 } 我自己对接口的定义为接口是方法签名的集合。 struct里面可以定义方法,也可以定义成员变量,像我一直在做测试驱动开发的事情,在我眼里,一个好的设计就是对象本身定义了必需的内部元素,接口则定义了对外表示的行为规范,按照这样的设计才能真正的做到解耦。 在Go语言中,必须实现在接口中声明的所有方法以实现接口。go语言接口是隐式实现的,官方是叫非侵入式接口。并且它不包含任何其他关键字来实现与其他语言一样的接口。 这点和我以前写c#和java的时候差别很大,以前创建一个接口实体类,必须显式声明。 public class Instance implements InterfaceA , InterfaceB { // ... } 区别在哪里呢? 在我看来,最大的区别在于

Golang源码探索(二) 协程的实现原理

左心房为你撑大大i 提交于 2019-12-31 22:04:19
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理. 这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit. 核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是 G , M 和 P , 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的轻量线程, goroutine使用 go 关键词创建. 举例来说, func main() { go other() } , 这段代码创建了两个goroutine, 一个是main, 另一个是other, 注意main本身也是一个goroutine. goroutine的新建, 休眠, 恢复, 停止都受到go运行时的管理. goroutine执行异步操作时会进入休眠状态, 待操作完成后再恢复, 无需占用系统线程,

golang下载和安装

你离开我真会死。 提交于 2019-12-30 13:59:35
下载 官网: https://golang.org/dl/ 下载对应系统的安装包 安装和卸载 官方安装 https://golang.org/doc/install 指导。 tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz export PATH=$PATH:/usr/local/go/bin 移除环境变量配置和/usr/local/go目录 Go wiki: https://github.com/golang/go/wiki 命令介绍 go <command> [arguments] bug start a bug report build compile packages and dependencies clean remove object files and cached files doc show documentation for package or symbol env print Go environment information fix update packages to use new APIs fmt gofmt (reformat) package sources generate generate Go files by processing source get add

GoLang系列-beego框架的安装(一)

送分小仙女□ 提交于 2019-12-30 04:56:43
GoLang系列-beego框架的安装(一) 前言:到这里相信大家应该对Go语言有了大概的了解,作为一个快速增长的开源编程语言,构建简单、快速并且可靠,那么在Go语言下有哪些Web开发框架呢?先放一张人气图如下: 当然上图仅供参考,但是可以说明的是Go下Web框架用的最多的还是Gin 和 Beego ;Gin作为一个Go语言写的HTTP Web框架,它提供了Martini风格的API并有更好的性能,而Beego同样作为Go语言下开源的,高性能Web框架他的性能虽不敌Gin,但是从各个功能完善角度讲,它是有非常大的优势的, 此篇博客将主要针对于Beego框架的使用进行介绍 Beego安装 (我这里主要以window为操作系统,其他操作系统安装原理一样) 1.首先安装Go https://golang.org/dl/ 上图为不同操作系统下的安装文件,我这里环境为Windows,下载完成之后在系统变量里配置环境变量,我这里安装到D盘Golang目录下,所以在path下添加: D:\Golang\bin 配置完成之后检查是否安装成功,如下可以看到已经成功安装Go,版本为1.13.5 C:\Users\Administrator>go version go version go1.13.5 windows/amd64 接下来我们配置GOPATH,也就是工作空间目录

golang垃圾回收

折月煮酒 提交于 2019-12-29 21:49:54
  go GC 的基本特征是非分代、非紧缩、写屏障、并发标记清理。核心是抑制堆增长,充分利用CPU资源。 1. 三色标记   是指并发(垃圾回收和用户逻辑并发执行)的对系统中的对象进行颜色标记,然后根据颜色将对象进行清理。基本原理: 起初将堆上所有对象都标记为白色; 从底部开始遍历对象,将遍历到的白色对象标记为灰色,放入待处理队列; 遍历灰色对象,把灰色对像所引用的白色对象也标记为灰色,将原灰色对象本身标记为黑色; 循环执行上一步,直至原灰色对象全部标记为黑色; 步骤4结束后,标记为白色的对象就是不可达对象,就是垃圾对象,可以进行回收。   最后white的对象都会被清理掉 写屏障   在进行三色标记的时候并没有STW,也就是说,此时的对象还是可以进行修改;考虑这样一种情况,在进行三色标记扫描灰色对象时,扫描到了对象A,并标记了对象A的所有引用,当开始扫描对象D的引用时,另一个goroutine修改了D->E的引用,变成了A->E的引用,就会导致E对象扫描不到而一直是白对象,就会被误认为是垃圾。写屏障就是为了解决这样的问题,引入写屏障后,在A->E后,E会被认为是存活的,即使后面E被A对象抛弃,E只会被在下一轮的GC中进行回收,这一轮GC不会回收对象E。   写屏障监视对象内存修改,重新标色或放回队列。   Go1.9中开始启用了混合写屏障,伪代码如下: 1

通向Golang的捷径【9. 包】

倖福魔咒の 提交于 2019-12-29 21:39:53
9.1 标准库 Go 语言发行版中, 包含了 150 个标准包, 其中包含大部分的基本功能, 比如 fmt,os 等, 这些包也被称为标准库, 除了一些底层包之外, 其他大部分包的文档, 都可在页面http://golang.org/pkg/中找到. 在本书的大部分示例中, 都会使用到标准包, 并且附录中将包含标准包的索引表和相关用法, 本章将描述一些包函数的用法, 但是并不会讨论这些包函数的内部细节. • unsafe: 可实现 Go 语言中类型安全的一些命令, 这些命令并不会在普通程序中实现, 而是常用于与 C/C++ 的接口. • syscall ⊕ os ⊕ os/exec: ▶ os: 可提供一个与平台无关的接口, 以实现与本地操作系统的关联, 基于类 Unix 系统, 完成了它们的设计, 同时它们隐藏了不同操作系统之间的差异, 以使文件以及其他操作系统对象, 可实现一致性的处理. ▶os/exec: 用于运行本地操作系统所包含的一些命令或程序. ▶ syscall: 这是一个底层包, 可为操作系统调用, 提供一个基本接口. 以下 Go 代码可实现 Linux 系统的重新启动命令 (reboot): 例 9.1 reboot.go •archive/tar: archive/zip-compress: 用于压缩和解压文件. • fmt ⊕ io ⊕ bufio ⊕

深入Golang调度器之GMP模型

血红的双手。 提交于 2019-12-29 19:04:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 随着服务器硬件迭代升级,配置也越来越高。为充分利用服务器资源,并发编程也变的越来越重要。在开始之前,需要了解一下并发(concurrency)和并行(parallesim)的区别。 并发 : 逻辑上具有处理多个同时性任务的能力。 并行 : 物理上同一时刻执行多个并发任务。 通常所说的并发编程,也就是说它允许多个任务同时执行,但实际上并不一定在同一时刻被执行。在单核处理器上,通过多线程共享CPU时间片串行执行(并发非并行)。而并行则依赖于多核处理器等物理资源,让多个任务可以实现并行执行(并发且并行)。 多线程或多进程是并行的基本条件,但单线程也可以用协程(coroutine)做到并发。简单将Goroutine归纳为协程并不合适,因为它运行时会创建多个线程来执行并发任务,且任务单元可被调度到其它线程执行。这更像是多线程和协程的结合体,能最大限度提升执行效率,发挥多核处理器能力。 Go编写一个并发编程程序很简单,只需要在函数之前使用一个Go关键字就可以实现并发编程。 func main() { go func(){ fmt.Println("Hello,World!") }() } Go调度器组成 Go语言虽然使用一个Go关键字即可实现并发编程,但Goroutine被调度到后端之后,具体的实现比较复杂

golang垃圾回收

孤街浪徒 提交于 2019-12-29 13:38:29
  go GC 的基本特征是非分代、非紧缩、写屏障、并发标记清理。核心是抑制堆增长,充分利用CPU资源。 1. 三色标记   是指并发(垃圾回收和用户逻辑并发执行)的对系统中的对象进行颜色标记,然后根据颜色将对象进行清理。基本原理: 起初将堆上所有对象都标记为白色; 从底部开始遍历对象,将遍历到的白色对象标记为灰色,放入待处理队列; 遍历灰色对象,把灰色对像所引用的白色对象也标记为灰色,将原灰色对象本身标记为黑色; 循环执行上一步,直至原灰色对象全部标记为黑色; 步骤4结束后,标记为白色的对象就是不可达对象,就是垃圾对象,可以进行回收。   最后white的对象都会被清理掉 写屏障   在进行三色标记的时候并没有STW,也就是说,此时的对象还是可以进行修改;考虑这样一种情况,在进行三色标记扫描灰色对象时,扫描到了对象A,并标记了对象A的所有引用,当开始扫描对象D的引用时,另一个goroutine修改了D->E的引用,变成了A->E的引用,就会导致E对象扫描不到而一直是白对象,就会被误认为是垃圾。写屏障就是为了解决这样的问题,引入写屏障后,在A->E后,E会被认为是存活的,即使后面E被A对象抛弃,E只会被在下一轮的GC中进行回收,这一轮GC不会回收对象E。   写屏障监视对象内存修改,重新标色或放回队列。   Go1.9中开始启用了混合写屏障,伪代码如下: 1

Sevice Computing:阅读:《Golang web 应用开发》

懵懂的女人 提交于 2019-12-28 12:29:37
Sevice Computing:阅读:《Golang web 应用开发》 为什么是Golang? Web工作方式 URL和DNS解析 HTTP协议 Go搭建一个Web服务器 Go如何使得Web工作 这次作业是阅读《Golang web 应用开发》,后来发现这次也是要写博客作业的,所以期末抽空又读了一下然后总结一下web章节和自己的想法。整本书在GitHub上面开源的,阅读链接如下: 《Golang web 应用开发》阅读链接 为什么是Golang? 这个部分书中其实没有写到,但是整章看下来其实我们可以感觉到,Golang开发Web应用是很方便的,同时又是相当的灵活。Golang 上手简单, 而且在语法上的要求相对不那么严格。同时Golang又有非常丰富的第三方库, 官方已经有提供net/http包为搭建http服务器做准备。使用这个包能很简单地对web的路由,静态文件,模版,cookie等数据进行设置。对于业务没那么复杂的项目,作为简单的web server, 写一些API 的后端是不错的选择。下面是对阅读内容重点的提炼和总结分析。 Web工作方式 我们在上网的过程其实就是web在工作。一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(其实手机端客户端内部也是浏览器实现的)。对于普通的上网过程,系统其实是这样做的: