Go语言中文网 为您找到相关结果 1019

【Golang源码系列】一:Map实现原理分析

作者:郭雨田 原文地址:https://mp.weixin.qq.com/s/c_... 一、map的结构与设计原理 golang中map是一个kv对集合。底层使用hash table,用链表来解决冲突 ,出现冲突时,不是每一个key都申请一个结构通过链表串起来,而是以bmap为最小粒度挂载,一个bmap可以放8个kv。在哈希函数的选择上,会在程序启动时,检测 cpu 是否支持 aes,如果支持,则使用 aes hash,否则使用 memhash。每个map的底层结构是hmap,是有若干个结构为bmap的bucket组成的数组。每个bucket底层都采用链表结构。接下来,我们来详细看下map的结构:** // A header for a Go map. type hmap struct {...阅读全文

博文 2020-03-23 19:32:42 LNMPR源码研究

Go Gin源码学习(四)

基数树 这次学习的是Gin中的路由,在学习源码一种我们看到了Gin的路由是它的特色。然而基础数据使用了基数树也提供了性能的保障。因为路由这部分比较独立而且逻辑相对复杂,所以需要单独学习。首先我们需要了解的是基数树,百度百科中的解释其中有一个图可以让我们更加直观的看到数据是如何存储的。基数树,相当于是一种前缀树。对于基数树的每个节点,如果该节点是确定的子树的话,就和父节点合并。基数树可用来构建关联数组。在上面的图里也可以看到,数据结构会把所有相同前缀都提取 剩余的都作为子节点。 基数树在Gin中的应用 从上面可以看到基数树是一个前缀树,图中也可以看到数据结构。那基数树在Gin中是如何应用的呢?举一个例子其实就能看得出来router.GET("/support", handler1)router...阅读全文

博文 2019-05-11 23:34:51 大二小的宝

兄弟连区块链教程btcpool矿池源码分析nmcauxmaker模块解析

兄弟连区块链教程btcpool矿池源码分析nmcauxmaker模块解析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。# btcpool矿池-nmcauxmaker模块解析## nmcauxmaker命令使用```shellnmcauxmaker -c nmcauxmaker.cfg -l log_nmcauxmaker#-c指定nmcauxmaker配置文件#-l指定日志目录```## nmcauxmaker.cfg配置文件```nmcauxmaker = {//rpc调用间隔(秒)rpcinterval = 10;//最近一次rpc调用时间写入文件fil...阅读全文

博文 2018-10-16 18:34:41 兄弟连区块链培训

golang 1.9 -a bug?

现象是,golang,项目里用了sqlite,gogland里debug时极慢 另外run或debug时提示需要gcc,即使install了之后同样提示需要gcc 发现gogland debug和run不同,加了 -a参数 go build -h -a force rebuilding of packages that are already up-to-date. 给gogland提issue后得知 It's an unfortunate side effect of GO-4249 go 1.9才有这问题 暂时先改下go源码绕过一下问题,提高debug速度,等待后续go或者goland的修...阅读全文

博文 2017-08-30 16:35:09 ddatsh

golang post get 用法

package main import ( "fmt" "io/ioutil" "net/http" "os" "strings" ) func GET() { client := &http.Client{} reqest, err := http.NewRequest("GET", "http://www.baidu.com/", nil) //建立一个请求 if err != nil { fmt.Println("Fatal error ", err.Error()) os.Exit(0) } //Add 头协议 reqest.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;...阅读全文

博文 2020-03-20 13:32:50 hw_owen

go database/sql 源码分析(二)driver包设计哲学

驱动接口设计特点 驱动层设计很简单,没有并发锁的控制 驱动层的设计是基于单个连接的,没有考虑连接池 驱动层事务Tx和Stmt是独立分离的,Tx只有两个简单的方法就是Commit() 和Rollback() 驱动的具体实现者只需要在单个连接上实现驱动层的API接口即可 driver包的数据结构 调用关系 驱动注册 具体的数据库驱动只需要按照接口层的定义,实现api,然后在sql包的全局驱动切片sql.drivers中注册即可。 27 var ( 28 driversMu sync.RWMutex 29 drivers = make(map[string]driver.Driver) 30 ) 38 func Register(name string, driver driver.Driver)...阅读全文

博文 2016-09-12 01:00:01 hittata

leetcode_684

Golang: 思路:依旧是并查集 代码如下: func findRedundantConnection(edges [][]int) []int { arr:=make([]int,len(edges)) for k,_:=range arr{ arr[k]=k } for _,v:=range edges{ if findUnion(arr,v[0])!=findUnion(arr,v[1]) { UnionVertex(arr,v[0],v[1]) }else{ return []int{v[0],v[1]} } } return []int{} } func UnionVertex(ver []int,i,j int) int { a,b:=findUnion(ver,i),find...阅读全文

博文 2020-03-05 21:33:07 淳属虚构

深入理解channel:设计+源码

channel是大家在Go中用的最频繁的特性,也是Go最自豪的特性之一,你有没有思考过: Why:为什么要设计channel? What:channel是什么样的? How:channel是如何实现的? 这篇文章,就来回答这3个问题。 channel解决什么问题? 在Golang诞生之前,各编程语言都使用多线程进行编程,但多线程复杂、混乱、难以管理,对开发者并不是多么友好。 Golang是Google为了解决高并发搜索而设计的,它们想使用简单的方式,高效解决并发问题,最后做成了,然后又把Golang开源了出来,以及到处推广,所以Golang自从诞生之初,就风风火火。 从Golang文档中,我们可以知道,为啥Golang设计了channel,以及channel解决了什么问题? Go Concu...阅读全文

博文 2019-03-04 22:34:45 shitaibin

《Go源码解读篇》之 Error

Go 语言中必不可少的类型 --- error,Go 中的原生代码少,而且易掌握. What is error? 官方解释,error 是一个內建接口,定义如下: // The error build-in interface type is the conventional // interface for representing an error condition, with // the nil value representing no error. type error interface { Error() string } 了解了 error 类型后我们就可以很轻松解读 errors 目录下的源码啦. Reading errors.go of the errors pack...阅读全文

博文 2017-09-01 07:10:16 x_zhaohu

golang avlTree 源码

这里吐槽下golang没有泛型,代码重叠太多package base import ( "fmt" "math" ) type( AvlBitTree struct { data int lchild *AvlBitTree rchild *AvlBitTree bt int } IAvlBitTree interface { Less(int) bool Equal(int) bool } ) func (this *AvlBitTree) Less(data int) bool{ return data < this.data } func (this *AvlBitTree) Equal(data int) bool{ return data == this.data } func G...阅读全文

博文 2018-03-28 10:37:29 bobohume

GO源码学习之channel

前言 channel是golang中标志性的概念之一,很好很强大! channel(通道),顾名思义,是一种通道,一种用于并发环境中数据传递的通道。通常结合golang中另一重要概念goroutine(go协程)使用,使得在golang中的并发编程变得清晰简洁同时又高效强大。 今天尝试着读读golang对channel的实现源码,拿起我生锈的水果刀,装模作样的解剖解剖这只大白老鼠。 channel基础结构 type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array o...阅读全文

博文 2018-07-19 12:34:47 tinywell

The Go scheduler

Go runtime的调度器: 在了解Go的运行时的scheduler之前,需要先了解为什么需要它,因为我们可能会想,OS内核不是已经有一个线程scheduler了嘛? 熟悉POSIX API的人都知道,POSIX的方案在很大程度上是对Unix process进程模型的一个逻辑描述和扩展,两者有很多相似的地方。 Thread有自己的信号掩码,CPU affinity等。但是很多特征对于Go程序来说都是累赘。 尤其是context上下文切换的耗时。另一个原因是Go的垃圾回收需要所有的goroutine停止,使得内存在一个一致的状态。垃圾回收的时间点是不确定的,如果依靠OS自身的scheduler来调度,那么会有大量的线程需要停止工作。 单独的开发一个GO的调度器,可以使其知道在什么时候内存状态...阅读全文

博文 2016-10-11 04:00:12 Lancerio

微服务错误处理的一些思考

前言 系统内和系统间的错误处理,贯穿系统整个开发、运行、消亡的生命周期,是代码书写过程中特别需要花心思的一点。一个地方报错了,我是直接返回,还是打印一行日志再返回?嵌套函数的报错,如何找到报错的根本原因?http或rpc接口中的错误码应该定义在每个response结构体内还是说通过http code、rpc error统一返回?本文会从系统内、系统间两个方面去阐述错误的定义、处理方式及相关的缘由。由于我平时主要使用go进行开发,系统内错误处理更多是从go角度出发。 系统内错误处理 "Go Proverbs” 复制代码 "Go圣经"中关于错误处理的有两条: 1.errors仅仅是变量;2.不要只是检查,更要平滑地处理errors。这两条其实既概括了我们平时处理errors的几种方式,又给出了处...阅读全文

博文 2020-04-01 16:34:31 cx3ptr

leetcode_338

Golang: 思路:这题以DP为思路,不算很难,以9为例,arr[9]=arr[8]+arr[9-8],arr[23]=arr[16]+arr[23-16] 代码如下: func countBits(num int) []int { if num==0 { return []int{0} } if num==1 { return []int{0,1} } arr:=make([]int,num+1) arr[0],arr[1],arr[2]=0,1,1 i:=2 for arr[num]==0 { temp,j:=i,i+1 i*=2 for j阅读全文

博文 2020-02-22 15:32:49 淳属虚构

java程序员的kotlin课(一):环境搭建

kotlin 出来也有些年头了,对于服务端的java程序员来讲,好多人对此并不感冒;这么多年出来的新语言多了,都说要怎么怎么样,到头来还是java稳。笔者也曾经持有这种看法,而且刚刚听说kotlin的时候,我正痴迷于学golang;所以接入kotlin的时间比一般人晚了许多。 但最近狠下心花了些时间学了一下kotlin,并强迫自己所有需要写java代码的地方都采用kotlin来做,越来越发现不想转回去写java了,这种感觉很像最开始从eclipse转到idea的时候,刚开始有点抗拒,各种快捷键也不熟悉,后来发现真的爽,而且回不去了。 经过一段时间的了解,我觉得kotlin有 3个方面的优点吸引了我: 与java项目无缝切换,可以混着写混着玩,不用一刀切的换成新语言,可以先尝一口试一试;这一点...阅读全文

博文 2020-01-23 06:32:41 青_雉

golang基础学习-base64使用

在近期的项目开发中对图片进行base64编码,简单使用了golang的base64包。 1.使用方法 1.1 引入包 import "encoding/base64" 1.2 base64使用 这里所有的例子都是官网上的范例;code: msg := "Hello, 世界" encoded := base64.StdEncoding.EncodeToString([]byte(msg)) fmt.Println(encoded) decoded, err := base64.StdEncoding.DecodeString(encoded) if err != nil { fmt.Println("decode error:", err) return } fmt.Println(strin...阅读全文

博文 2019-08-21 17:32:46 wmm369

TiKV 源码解析系列——如何使用 Raft

TiKV 源码解析系列——如何使用 Raft 本系列文章主要面向 TiKV 社区开发者,重点介绍 TiKV 的系统架构,源码结构,流程解析。目的是使得开发者阅读之后,能对 TiKV 项目有一个初步了解,更好的参与进入 TiKV 的开发中。需要注意,TiKV 使用 Rust 语言编写,用户需要对 Rust 语言有一个大概的了解。另外,本系列文章并不会涉及到 TiKV 中心控制服务 Placement Driver(PD) 的详细介绍,但是会说明一些重要流程 TiKV 是如何与 PD 交互的。TiKV 是一个分布式的 KV 系统,它采用 Raft 协议保证数据的强一致性,同时使用 MVCC + 2PC 的方式实现了分布式事务的支持。 概述 本文档主要面向 TiKV 社区开发者,主要介绍 TiKV...阅读全文

博文 2017-02-10 02:38:50 PingCAP

istio源码分析——mixer遥测报告

文:istio源码分析——mixer遥测报告 声明 这篇文章需要了解istio,k8s,golang,envoy,mixer基础知识 分析的环境为k8s,istio版本为0.8.0 遥测报告是什么 这篇文章主要介绍mixer提供的一个GRPC接口,这个接口负责接收envoy上报的日志,并将日志在stdio和prometheus展现出来。 “遥测报告”这个词是从istio的中文翻译文档借过来,第一次听到这个词感觉很陌生,很高大上。通过了解源码,用 “日志订阅“ 这个词来理解这个接口的作用会容易点。用一句话来总结这个接口的功能:我有这些日志,你想用来做什么?stdio和prometheus只是这些日志的另一种展示形式。 istio.io/istio/mixer/pkg/api/grpcServe...阅读全文

博文 2018-07-19 01:34:48 小卜邪

快速产生一个随机字符串

目录 [−] 最通用的方案字节替换rune使用余数掩码掩码加强版SourceBenchmark代码其它提升 如何高效的产生一个随机字符串?这看似是一个简单的问题,但是icza却通过例子,逐步优化,实现了一个更高效的随机字符串的算法。这是来自的来自stackoverflow上的一个问题:How to generate a random string of a fixed length in Go?, 大家群策群力,提出了很好的方案和反馈,尤其是icza的回答。 本文翻译和整理自这条问答。 问题是这样的: 我想要一个Go实现的固定长度的随机字符串(包括大小写字母,但是没有数字),哪种方式最快最简单? 优化基于Paul Hankin提出的一种方案(第一种方案),也就是最基本最容易理解的一种方案, ...阅读全文

博文 2018-09-02 22:19:23 smallnest

一个TCP长连接设备管理后台工程(三)

前篇: 一个TCP长连接设备管理后台工程(一)一个TCP长连接设备管理后台工程(二) Github仓库地址 TCP协议整合JTT808协议 前面简单说明了基于golang的net库进行TCP通讯。现在我们需要将现有的协议整合进去。行业内车辆终端一般都是对接交通部的JTT808协议,此处我们要实现的是JTT808-2019版本。 消息结构 标识位 消息头 消息体 校验码 标识位 0x7e 0x7e 标识位应采用0x7e表示,若校验码、消息头以及消息体中出现0x7e及0x7d,则要进行转义处理。转义规则定义如下: 先对0x7d进行转义,转换为固定两个字节数据:0x7d 0x01; 再对0x7e进行转义,转换为固定两个字节数据:0x7d 0x02。 转义处理过程如下: 发送消息时:先对消息进行封装...阅读全文

博文 2019-12-27 17:32:42 qiuzhiqian

时间戳抽取工具go_time_finder介绍

GoTimeFinder --- ![author](https://img.shields.io/badge/author-anderson--lu-yellow.svg?longCache=true&style=flat-square) ![build](https://img.shields.io/badge/build-passing-green.svg?longCache=true&style=flat-square) GoTimeFinder是一个基于golang编写的可以从一段文本中识别出对应时间戳的工具库.比如从`今天是2017年1月1日 12:99:22`中提取出相应的日期时间戳数据,支持国内外多种时间和日期格式,当然也包括类似`1s ago`的时间抽取 ...阅读全文

golang 模板 学习

1. 如何在html 中显 图片之类的? 启用静态服务器 : 如: http.handle("/", http.FileServer(http.Dir("/a"))) : 包含/a 的原因是开启/a 目录下的访问权限。这样则在html 中 就能访问到/a/xx.jpg。 2. 解析html 页面, href 中含有中文, 下载问题? {{range .name}} < ahref="{{.}}">
{{end}} a) :当template 解析上段代码时, {{.}} 假设 被 "你好.txt" 给取代, 当在浏览器显示源码时, href=%e4%bd%a0%e5%a5%bd...阅读全文

博文 2016-08-29 12:00:07 SLonger

go run(转载极客学院)

go run 在《Go并发编程实战》的第二章中,我介绍了Go源码文件的分类。Go源码文件包括:命令源码文件、库源码文件和测试源码文件。其中,命令源码文件总应该属于main代码包,且在其中有无参数声明、无结果声明的main函数。单个命令源码文件可以被单独编译,也可以被单独安装(可能需要设置环境变量GOBIN)。当然,命令源码文件也可以被单独运行。我们想要运行命令源码文件就需要使用命令go run。 go run命令可以编译并运行命令源码文件。由于它其中包含了编译动作,因此它也可以接受所有可用于go build命令的标记。除了标记之外,go run命令只接受Go源码文件作为参数,而不接受代码包。与go build命令和go install命令一样,go run命令也不允许多个命令源码文件作为参数...阅读全文

博文 2017-12-23 06:16:49 xionglu152

go database/sql 源码分析 -题外篇

第一篇go database/sql 源码分析 的文章对其作者(Brad Fitzpatrick大神 memcached的作者 go语言项目组成员)给予高度评价,但是个人认为go database/sql 的实现不是完美无瑕的 优点: 接口设计简单,清晰,一致,友好:应用层的调用接口和驱动层的实现接口几乎一致,使用者毫无压力; 缺点: 包内部实现异常复杂、杂乱,给人一种错觉到底是因为逻辑就复杂还是实现的有问题; 这也是大牛的特点,你不要管我的实现,我只要保持接口的清晰,你只管用就好了,至于内部实现是我自己的事情,我不保证可读性,我可以使用我认为的任何技巧; 个人觉得database/sql包内部实现的不科学的地方: 1.为了实现并发,大量的使用锁的结构: 这个有违golang 的编程哲学,但...阅读全文

博文 2016-09-12 01:00:00 hittata

GO语言的并发

package main import ("fmt" "runtime" "time") func hello(s string) { for i := 0; i < 10; i++ { runtime.Gosched(); fmt.Println("here:", s); time.Sleep(5000); } } func main() { go hello("lili2"); hello("lili1"); } 如上的小程序,在没有等待时,实际上 只会打印出来lili, 而不会打印出来 lili2, 只有加了比较大的时间间隔,才会打印出来,准备看下源码,怎么实现的...阅读全文

博文 2015-06-17 23:02:24 hnhbdss

LeetCode Practice(一)

第一题:计算二进制数两个1之间的间距 题目: 我的思路 英文翻译过来就是把数字化成二进制,计算两个1之间的最大间距。1000,1100,1010的最大间距分别是0,1,2.以此类推 我的第一反应是大学数字逻辑课上的一个知识点,十进制转化为二进制——短除法! 也就是说,在接收到输入的十进制数之后,利用短除法,转化为二进制数。转化的过程进行间距的计算 虽然短除法先计算出来的是二进制低位的数,但是1010的间距从左往右数和从右往左数,结果是等价的 实现如下: func BiggestGap(n int) int { distance,temp := 0,0 bValue := 0 for n,bValue = bDiv(n);bValue==0; { n,bValue = bDiv(n) } fo...阅读全文

博文 2019-06-04 10:32:43 Mandelbrot_Kobe

如何通过MD5反查身份证号?

题目:设计一个身份证查询系统,将身份证号md5 之后存储,输入md5值查询对应的身份证号。 要求:成本低,查询速度快 设计思路: 将所有可能的身份证号做一个简单的统计计算数据量 根据数据量选择存储方式 查询 身份证生成规则: 身份号码是特征组合码,由前十七位数字本体码和最后一位数字校验码组成。排列顺序从左至右依次为六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 地址码: 表示编码对象常住户口所在县(市、旗、区)的行政区划代码。对于新生儿,该地址码为户口登记地行政区划代码。需要没说明的是,随着行政区划的调整,同一个地方进行户口登记的可能存在地址码不一致的情况。行政区划代码按GB/T2260的规定执行。 出生日期码:表示编码对象出生的年、月、日,年、月、日代码之间不用分隔符...阅读全文

Web程序性能优化——asm.js和WebAssembly

asm.js asm.js是JavaScript语言中一个可以高度优化的子集。通过避免JavaScript引擎某些难以优化的机制和模式(主要是垃圾回收和类型判断),达到JavaScript引擎运行优化的目的。换言之,正常的JavaScript代码会类型自动装换和垃圾自动回收的,而编写asm.js风格的代码则表示程序员需要管理内存和确定数据类型。 asm.js不提供任何额外的语法,只要编写asm.js的代码,在支持asm.js优化的JavaScript引擎中能被自动识别,从而让引擎实现自己的优化,而在不支持asm.js的引擎中也能正常运行。 手写asm.js例子 首先解决的是JavaScript中变量类型的问题 var a = 10; var b = a; var a = 10; var b ...阅读全文

博文 2019-01-14 17:34:43 广州芦苇科技web前端

golang之数据校检

目前大都是使用validator 安装 go get gopkg.in/go-playground/validator.v9 原理 当然只能通过反射来实现了,之前写过一篇反射的文章golang之反射和断言,里面有写到怎么通过反射获取struct tag。 读取struct tag之后就是对里面的标识符进行识别,然后进行验证了。具体可以去看源码。 demo 简单使用: package main import ( "fmt" "gopkg.in/go-playground/validator.v9" ) // User contains user information type UserInfo struct { FirstName string `validate:"required"` L...阅读全文

博文 2019-10-15 23:32:58 aside section ._1OhGeD

Go语言开发工具 LiteIDE0.1.6 released

LiteIDE简介 go语言开发工具,更新至0.1.6,支持WIN32/Linux64bit。 实现特征: *) UTF8文件读写 *) GO语法高亮 *) 项目管理 *) 支持.pro项目编译 *) 支持无项目单独文件编译 *) gopromake自动编译工具 *) 可以从编译错误中定位到源码 项目主页: http://code.google.com/p/golangide/ 项目下载: http://code.google.com/p/golangide/downloads/list 操作系统支持: WIN32 LINU...阅读全文

博文 2015-06-17 23:00:48 visualfc

golang发送邮件

SSL协议发送邮件的方法 package utils import ( "crypto/tls" "fmt" "log" "net/smtp" "strings" ) const Email_User = "*******@163.com" const Email_Password = "***********" const Email_Host = "smtp.163.com" const Email_Port = "465" const Email_Name = "测试" const Email_Subject = "测试验证码" type Mail struct { senderId string toIds []string subject string body string } ...阅读全文

博文 2019-03-05 14:35:09 万年小学生

go build 编译 Prometheus

本文说明:go build 编译 prometheus、promtool #环境:go1.11及以上版本 #下载最新源码:[https://github.com/prometheus/prometheus](https://github.com/prometheus/prometheus) cd ${yourPath}/prometheus rm -rf vendor #编译得到 prometheus go build ./cmd/prometheus #编译得到 promtool go build ./cmd/promtool #done touch ./conf/prometheus.yml ./prometheus --config.file="./conf/prometheus.ym...阅读全文

博文 2019-04-11 19:34:40 hello_xxxx

Go Gin源码学习(五)

Gin路由主要流程实现 经过上一篇的学习笔记,我们已经知道了Gin router的主要流程。但是我们看到代码和方法体总体很长,其中大部分是参数路由的判断。这些零散的小逻辑,让我们阅读源码的时候更难理解了一些。但是其实基数树的逻辑兵没有这么的复杂,所以我们还是按照老规矩,自己实现以下这个简单的基数树值包含主流程。代码如下: package mygin import "fmt" type Trees map[string]*node type node struct { path string indices string children []*node handlers HandlerList } func (n *node) addRoute(path string, handlers H...阅读全文

博文 2019-05-15 00:34:46 大二小的宝

兄弟连区块链教程以太源码分析accounts账户管理分析

兄弟连区块链入门教程以太源码分析accounts账户管理分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。##数据结构分析ETH的账户管理定义在accounts/manager.go中,其数据结构为:```// Manager is an overarching account manager that can communicate with various// backends for signing transactions.type Manager struct {backends map[reflect.Type][]Backend // Inde...阅读全文

博文 2018-10-17 19:34:39 兄弟连区块链培训

兄弟连区块链入门教程以太坊源码分析fast sync算法一

兄弟连区块链入门教程以太坊源码分析fast sync算法一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。this PR aggregates a lot of small modifications to core, trie, eth and other packages to collectively implement the eth/63 fast synchronization algorithm. In short, geth --fast.这个提交请求包含了对core,trie,eth和其他一些package的微小的修改,来共同实现eth/63...阅读全文

博文 2018-10-25 18:34:40 兄弟连区块链培训

go命令

Go命令教程 (访问密码:kmNYam)Go命令教程 build compile packages and dependencies clean remove object files doc show documentation for package or symbol env print Go environment information fix run go tool fix on packages fmt run gofmt on package sources generate generate Go files by processing source get download and install packages and dependencies install com...阅读全文

博文 2017-03-05 19:42:54 紫若丹枫

兄弟连区块链教程以太坊源码分析core-genesis创世区块源码分析

genesis 是创世区块的意思. 一个区块链就是从同一个创世区块开始,通过规则形成的.不同的网络有不同的创世区块, 主网络和测试网路的创世区块是不同的. 这个模块根据传入的genesis的初始值和database,来设置genesis的状态,如果不存在创世区块,那么在database里面创建它。 数据结构 // Genesis specifies the header fields, state of a genesis block. It also defines hard// fork switch-over blocks through the chain configuration.// Genesis指定header的字段,起始块的状态。 它还通过配置来定义硬叉切换块。type ...阅读全文

博文 2018-10-19 11:34:47 兄弟连区块链培训

Golang Once源码解析

sync.Once可以实现单例模式,确保sync.Once.Do(f func())只会被执行一次,可以初始化某个实例单例。 针对Golang 1.9的sync.Once,与Golang 1.10一样。 源代码位置:sync\once.go。 结构体 Once结构体定义如下: type Once struct { m Mutex done uint32 // 初始值为0表示还未执行过,1表示已经执行过 } Do func (o *Once) Do(f func()) { // done==1表示已经执行过了,直接结束返回 if atomic.LoadUint32(&o.done) == 1 { return } // 锁住对象,避免并发问题 o.m.Lock() defer o.m.Unlo...阅读全文

博文 2018-07-02 14:39:13 梦朝思夕

go sync.Map源码分析

概述 go 语言中的map并不是并发安全的,在Go 1.6之前,并发读写map会导致读取到脏数据,在1.6之后则程序直接panic. 因此之前的解决方案一般都是通过引入RWMutex(读写锁)进行处理,关于go为什么支持map的原子操作,概况来说,对map原子操作一定程度上降低了只有并发读,或不存在并发读写等场景的性能.但作为服务端来说,使用go编写服务之后,大部分情况下都会存在gorutine并发访问map的情况,因此,1.9之后,go 在sync包下引入了并发安全的map.这里将从源码对其进行解读. 1. sync.Map提供的方法 存储数据,存入key以及value可以为任意类型. func (m *Map) Store(key, value interface{}) 删除对应key ...阅读全文

博文 2018-03-31 15:34:39 沐风

golang的goroutine是如何实现的?

在了解Go的运行时的scheduler之前,需要先了解为什么需要它,因为我们可能会想,OS内核不是已经有一个线程scheduler了嘛? 熟悉POSIX API的人都知道,POSIX的方案在很大程度上是对Unix process进场模型的一个逻辑描述和扩展,两者有很多相似的地方。 Thread有自己的信号掩码,CPU affinity等。但是很多特征对于Go程序来说都是累赘。 尤其是context上下文切换的耗时。另一个原因是Go的垃圾回收需要所有的goroutine停止,使得内存在一个一致的状态。垃圾回收的时间点是不确定的,如果依靠OS自身的scheduler来调度,那么会有大量的线程需要停止工作。 单独的开发一个GO得调度器,可以是其知道在什么时候内存状态是一致的,也就是说,当开始垃圾回...阅读全文

博文 2016-10-11 03:01:35 tqyin

Go Gin源码学习(四)

### 基数树 这次学习的是Gin中的路由,在学习源码一种我们看到了Gin的路由是它的特色。然而基础数据使用了基数树也提供了性能的保障。因为路由这部分比较独立而且逻辑相对复杂,所以需要单独学习。 首先我们需要了解的是基数树,[百度百科中的解释](https://baike.baidu.com/item/%E5%9F%BA%E6%95%B0%E6%A0%91/22853708?fr=aladdin) 其中有一个图可以让我们更加直观的看到数据是如何存储的。 ![image](https://baike.baidu.com/pic/%E5%9F%BA%E6%95%B0%E6%A0%91/22853708/0/f3d3572c11dfa9ec0ffcf42f6fd0f703918fc13c?fr=l...阅读全文

博文 2019-05-11 23:05:12 panlei914

书籍《自底向上分析 boltdb 源码》

# 一、为什么会有《自底向上分析boltdb源码》本书? 当初自己尝试学习boltdb时,摸索了很久,一方面网上讲解内部实现的资料少之又少,另一方面很多文章的分析也只是在理论上,自己回头看源码一脸懵逼。 所以在自己入坑折腾了一段时间后,把自己的理解和总结整理了下,方便对这块感兴趣的小伙伴,少走弯路,降低门槛。 # 二、 boltdb是什么? 在用自己的话介绍boltdb之前,我们先看下boltdb官方是如何自我介绍的呢? > Bolt is a pure Go key/value store inspired by [Howard Chu's][hyc_symas] [LMDB project][lmdb]. The goal of the ...阅读全文

星际源码 2018-10-30

序言梁川,资深架构师,拥有10年以上一线技术从业经验。梁先生精通Erlang、python、Golang、java; 擅长各种平台高并发大流量架构设计与实施; 精通Ethereum区块链以及相关技术; 通读Go-Ethereum源码。我们开辟《星际源码》专栏,请梁先生为我们讲讲高深的架构技术。梁先生将会不定期的随时分享他在工作中的感想与新知,希望与感兴趣的开发者朋友们一同学习成长! go-libp2p-host Connect 源码分析Connect 过程解析• go-libp2p-host中定义了Host接口,它有几个实现都在go-libp2p包中,我们关注basic包中的BasicHost实现,因为IPFS用了这个实现• Connect主要是dial peer并完成握手,再去交换Iden...阅读全文

博文 2018-11-03 01:34:44 IMTOfficial

golang 模板 学习

1. 如何在html 中显 图片之类的? 启用静态服务器 : 如: http.handle("/", http.FileServer(http.Dir("/a"))) : 包含/a 的原因是开启/a 目录下的访问权限。这样则在html 中 就能访问到/a/xx.jpg。 2. 解析html 页面, href 中含有中文, 下载问题? {{range .name}} < ahref="{{.}}">
{{end}} a) :当template 解析上段代码时, {{.}} 假设 被 "你好.txt" 给取代, 当在浏览器显示源码时, href=%e4%bd%a0%e5%a5%bd...阅读全文

博文 2016-09-12 12:00:43 SLonger

golang信号处理

go语言中处理信号很简单,并且不会中断程序的正常运行逻辑。 想监听一个信号只需要调用Notify函数 **func Notify(c chan<- os.Signal, sig ...os.Signal)** + sig 表示你希望监听的信号,如果不设置表示监听所有的信号。 + c 表示当信号发生时,系统会往该channel中写入发生的信号。 如果不想监听信号则可以调用stop **func Stop(c chan<- os.Signal)** ##实例解析 ``` exitChan := make(chan struct{}) func main() { //开启一个goroutine专门处理信号 go HanleSignal() <-exitChan //释放程序占用资源,优雅退出 } ...阅读全文

博文 2017-02-09 20:01:25 shanks

结合源码理解interface{}

首先要明确go中的interface分为两种,无方法声明和有方法声明的的,对应源码中的定义如下: //有方法声明 type iface struct { tab *itab data unsafe.Pointer } //无方法声明 type eface struct { _type *_type data unsafe.Pointer } 其中data指向实际的值信息,_type是对定义内部类型信息的数据结构,itab里定义了接口相关信息,包括接口类型、实际类型、实现的方法集等: type itab struct { inter *interfacetype _type *_type link *itab hash uint32 // copy of _type.hash. Used fo...阅读全文

博文 2018-07-31 19:34:47 ShutLove

PythonGUI+爬虫-从零打造12306抢票软件

课程介绍:此项目为GUI+爬虫+反反爬虫+网络多线程+自动打码+缓存机制+数据清洗等多项技术综合一体的项目;开发中更能体验抓包思路, MVC, 分层, 封装重构等思想课程目录:001、12306抢票软件项目-项目展示002、12306抢票项目开篇-2019新年快乐!003、抢票软件项目-项目需求和原型图004、网络基础-网络-IP-域名概念005、网络基础-客户端和服务器概念006、网络基础-客户端和服务器角色007、网络基础-HTTP协议-上008、网络基础-HTTP协议-中009、网络基础-HTTP协议-下010、网络基础-基于Cookie和Session的验证码和登录机制011、开发实战-环境搭建012、开发实战-登录模块-界面搭建013、开发实战-登录模块-验证码下载展示014、开发...阅读全文

博文 2020-01-14 22:57:48 lijm1266