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

Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析golang的源代码来讲解协程的实现原理. 这个系列分析的golang源代码是Google官方的实现的1.9.2版本, 不适用于其他版本和gccgo等其他实现, 运行环境是Ubuntu 16.04 LTS 64bit. 核心概念 要理解协程的实现, 首先需要了解go中的三个...阅读全文

阅读:25033 评论:5

Golang 微框架 Gin 简介

所谓框架 框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了。成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应手的时候,可以尝试改造一些框架,或是自己创造一个。 曾经我以为Python世界里的框架已经够多了,后来发现相比golang简直小巫见大巫。golang提供的net/http库已经很好了,对于http的协议的实现非常好,基于此再造框架,也不会是难事,因此生态中出现了很多框架。既然构造框架的门...阅读全文

2017-12-04 00:03:06 mickelfeng
阅读:48579 评论:1

Golang中重新open 已经被close的chan管道

最近忽发奇想,在Golang中怎么把,已经关闭的管道再次打开。这样就避免了,每次都要make一个新的chan,节省内存申请和GC的时间,查看go的源代码,经过简单地摸索后,实现了,示例代码如下。 func TestUnsafe ( t * testing . T ) { c1 = make ( chan struct {}, 10 ) c1 <- struct {}{} <- c1 close ( c1 ) p := ( * unsafe . Pointer )( unsafe . Pointe...阅读全文

2017-01-05 09:54:17 GoWKH
阅读:2344 评论:0

Golang 中的微服务 - 第一部分

## 介绍 Golang 中的微服务系列总计十部分,预计每周更新。本系列的解决方案采用了 protobuf 和 gRPC 作为底层传输协议。为什么采用这两个技术呢?我花了相当长的时间,才想出并决定采用这个方案。这个方案对开发者来说,非常清晰而简明。我也很乐意把自己在搭建、测试和部署端到端的微服务过程中的心得,分享给想接触这块的朋友们。 在这个教程中,我们将先接触几个基础的概念和术语,然后开始搭建第一个简单的微服务模型。 本系列中,我们将会创建以下服务: - 委托 - 存...阅读全文

2017-12-26 22:20:00 polaris
阅读:28636 评论:15

Golang的反射reflect深入理解和示例

[TOC] Golang的反射reflect深入理解和示例 【记录于2018年2月】 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和...阅读全文

阅读:70875 评论:12

Go Context的踩坑经历

0 引言context是Go中广泛使用的程序包,由Google官方开发,在1.7版本引入。它用来简化在多个go routine传递上下文数据、(手动/超时)中止routine树等操作,比如,官方http包使用context传递请求的上下文数据,gRpc使用context来终止某个请求产生的routine树。由于它使用简单,现在基本成了编写go基础库的通用规范。笔者在使用context上有一些经验,遂分享下。本文主要谈谈以下几个方面的内容:context的使用。context实现原理,哪些是需要注...阅读全文

2019-08-24 17:47:06 包增辉
阅读:32726 评论:4

悲观锁 在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。 悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。 在数据库中,悲观锁的流程如下: 在对任意记...阅读全文

2018-05-11 16:03:37 lobo
阅读:1846 评论:7

Go 学习之路:引用类型与值类型

Golang中只有三种引用类型:slice(切片)、map(字典)、channel(管道); 引用类型 引用类型理解为(C语言):指针 值类型 值的拷贝 下面以值类型和slice(切片)例子可知: package main import "fmt" func main(){ a := [5]int{2, 3, 4, 5, 6} b := a fmt.Println(a,b) b[2] = 77 fmt.Println(a,b) } 上面定义了一个数组a,它是值类型,复制给b是copy,当b发生变...阅读全文

2018.06.28 15:40 fudomine
阅读:3000 评论:1

Golang 对MongoDB的操作简单封装

Golang 对MongoDB的操作简单封装 使用MongoDB的Go驱动库 mgo,对MongoDB的操作做一下简单封装 初始化 操作没有用户权限的MongoDB var globalS *mgo.Session func init() { s, err := mgo.Dial(dialInfo) if err != nil { log.Fatalf("Create Session: %s\n", err) } globalS = s } 如果MongoDB设置了用户权限需要使用下面的方法操作...阅读全文

2018.07.04 11:57 CodeMiner
阅读:1935 评论:1

grpc+consul

最近在学习研究golang的rpc框架,这两天学习了grpc,学习demo,https://github.com/nosixtools/LearnGrpc目前两大主流跨语言的RPC框架:gRPC,Thrift 算是屠龙刀跟倚天剑吧,萝卜青菜各有所爱,就看各位看官的实际需求和兴趣了。开始主题,gprc-go官方未提供目前主流(consul,zookeeper,etcd)服务注册和发现的实现,这部分需要根据自己公司的注册中心实现就好了,官方给出了基于DNS的实现,可以查看这个文件https://gi...阅读全文

2018.08.22 18:35 何亚祥
阅读:5929 评论:1

Golang中的RPC和gRPC

一、RPC编程 参考资料<<Go语言编程>> --许式伟 gRPC介绍与安装 gRPC官方文档 gRPC中文文档 protocol-buffers 介绍 RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议。RPC协议构建于TCP或UDP,或者是HTTP上。允许开发者直接调用另一台服务器上的程序,而开发者无需另外的为这个调用过程编写网络通信相关代码,使得开发网络分布式程序在内的应用程序更加容易 RP...阅读全文

2018-09-10 11:34:42 xiaodulala
阅读:15449 评论:3

深入理解 sync.RWMutex:解决读者-写者问题

在某个数据需要被多个线程共享访问的时候,会出现读者-写者问题(这里的「问题」是复数形式的,因为读者-写者问题有多个变种)。访问共享数据的线程有两种类型:读者和写者。读者只会读取数据,而写者则是修改它。当写者拥有了访问数据的权限后,其它的线程(不管是读者还是写者)都不能访问这个数据。这种约束的需求在现实中是存在的,比如:当写者不能原子性地修改某个数据(例如数据库)时,在修改完成之前,要读取这个数据的读者要被阻塞,以免读者获取到损坏的数据(脏数据)。对于读者-写者问题的核心,还有很多修订的限制,比如...阅读全文

2018-09-10 22:25:10 polaris
阅读:8757 评论:0

快速开始使用grpc(golang版)

开始前准备 安装gprc go get -u google.golang.org/grpc 安装protocol buffers protoc编译器这个用于生成gRPC服务代码的。 下载解压后放入PATH路径,供后续使用。接下来安装protoc的go语言的插件go get -u github.com/golang/protobuf/protoc-gen-go 。 注意:这边插件也必须要在PATH路径下 栗子 采用$GOPATH/src/google.golang.org/grpc/example...阅读全文

2018.12.03 17:05 你家旭哥
阅读:17721 评论:0

使用 Go(Golang)实现 OAuth2.0

2018 年 7 月 1 日 OAuth2 是一种身份验证协议,用于使用其他服务提供商来对应用程序中的用户进行身份验证和授权。 本文将介绍如何构建 Go 应用程序  来实现 OAuth2 协议。 > 如果您想查看代码,可以在[此处](https://github.com/sohamkamani/go-oauth-example) 查看 ## OAuth2 流程 在我们开始实现之前,让我们简要介绍一下 OAuth 协议。如果您曾经见过类似这样的对话框,那么您可能对 ...阅读全文

阅读:13452 评论:0

用gorilla websocket 搞一个聊天室

这个demo实现了: 消息广播 心跳检测 通过命令行来进行聊天 具体逻辑都在 websocket.go 这个文件里 这里的核心就是 aliveList 这个全局变量, 负责把消息分发给各客户端, 事件用channel来传递, 减少阻塞 单个链接会在 aliveList 中注册, ConnList 就是所有活跃的链接 // AliveList 当前在线列表 type AliveList struct { ConnList map[string]*Client register chan *Clie...阅读全文

2019-01-22 11:34:43 只是一个id
阅读:2271 评论:0

“B站源码泄露”事件后,go语言成了焦点

一、B 站后端源码被恶意“开源” 几 小时1、B站源码泄露事件始末今日,网上传出消息,bilibili整个网站后台工程源码泄露,这是国内规模较大的互联网企业中首例整个网站后台工程源码泄露。而且B站网站不仅仅是泄露工程源码这么简单,有很大一部分用户的用户名密码被硬编码在代码里面,也泄露出去了,对用户来说影响很大。 作为国内go语言的大厂,哔哩哔哩代码被上传到了github,平台上确实存在由一个名叫「openbilibili」的用户创建的「go-common」代码库,项目描述为「哔哩哔哩 bilib...阅读全文

2019.04.23 15:31 qfliweimin
阅读:26597 评论:2

Micro In Action(一):入门

![](https://s2.ax1x.com/2020/03/10/8FZ2kD.png) 这个系列聊一聊 [Micro](https://micro.mu/), 我们将以实际开发微服务为主线,顺带解析相关功能。从最基本的话题开始,逐步转到高级特性。 Micro 很强大,掌握后使用起来也相当便利。 但它的演进速度非常快, 导致其文档有严重缺失和滞后。 很多功能没有文档;很多基本问题不得不去 GitHub 上提 issue 或去 Slack 里面问,又得不到什么反馈。最后, 查...阅读全文

阅读:2503 评论:0

Golang中的Defer必掌握的7知识点

在用Golang开发的时候,defer这个语法也是必备的知识,但是我们除了知道他是在一个函数退出之前执行,对于defer是否还有其他地方需要注意的呢。 本文整理的defer的全场景使用情况,部分场景源自网络,加上自己的额外观点和分析,完成了这份defer的7个隐性必备知识点。 提纲如下: 知识点1: defer的执行顺序 知识点2:defer与return谁先谁后 知识点3:函数的返回值初始化与defer间接影响 知识点4:有名函数返回值遇见defer情况 知识点5:defer遇见panic 知...阅读全文

阅读:2798 评论:2

我用go-zero开发了第一个线上项目

作者:结冰前言​ 说在最前面,我是一个外表谦让,内心狂热,外表斯文,内心贪玩的一个普通人。我的职业是程序员,是一个golang语言爱好者,一半是因为golang好用,一半是因为其他语言学不好。我是从phper转为gopher的,写php的时候我认识了互联网软件,写go的时候感觉自己终于在编程。初见golang​ 我大学专业是软件。第一门编程语言是C++,知道了指针,知道了加减乘除,知道了编程去控制软硬件。后来选修了java,被ssh框架戏耍了一个暑假。再后来进入了一个社团技术部,再被html/c...阅读全文

2020-12-21 20:32:33 kevinwan
阅读:6205 评论:0