beego自定义404 .tpl源码被打印出来了
按照官方教程 自定义了404 方法,调用 views/404.tpl 结果 在url出错的情况下 ,404.tpl的源码被打印出来了, 这是怎么回事呢,?谢谢 ...阅读全文
按照官方教程 自定义了404 方法,调用 views/404.tpl 结果 在url出错的情况下 ,404.tpl的源码被打印出来了, 这是怎么回事呢,?谢谢 ...阅读全文
一、下载Sublime Text3读者可以在官网http://www.sublimetext.com/3下载【备注】:由于我用的操作系统是win8 64位,所以选择Windows 64 bit链接下载二、注册Sublime Text31、安装完之后打开Sublime Text会发现软件没有注册,其实不注册关系也不大,只是在后面使用时会弹框影响易用性2、打开Sublime Text,选择“Help > Enter License”3、输入注册码(注意把BEGIN和END所在行也复制过去),单击Use License----- BEGIN LICENSE -----K-20Single User LicenseEA7E-9401293A099EC1 C0B5C7C5 33EBF0CF BE82F...阅读全文
????Base64captcha 项目地址???? 几行代码就可以定义自己内容的图形验证码库,支持任意unicode字符的内容. 1. ???? 文档&Demo ???? English 中文文档 Playground 2. ???? 快速上手 ???? 2.1 ???? 下载base64Captcha包 ???? go get -u github.com/mojocn/base64Captcha 2.2 ???? 在你的项目中使用base64Captcha ???? 2.2.1 ???? 实现Store interface 或者使用自带memory store ???? Build-in Memory Store(只支持单机部署,多台服务器请自定义redis store) type St...阅读全文
golang中有一条代码规范检查: if block ends with a return statement, so drop this else and outdent its block 例如以下代码: else处会提示: if block ends with a return statement, so drop this else and outdent its blockgo-lint if k8serrors.IsNotFound(err) { c.deletePodQueue.Add(key) return } else { klog.Errorf("failed to get statefulset %v", err) return } 网上搜索有部分不太正确的解释或者修改...阅读全文
排序是工程中必不可少的功能,很多编程语言SDK都提供了排序相关的实现。作为软件工程师,我们在学习各类排序算法的同时,是否有思考过,如何去实现一个工业级的排序算法?如果你是Go语言的作者之一,该如何去实现一种能适应多种情况的排序算法? Go SDK中排序相关的实现主要在sort/sort.go中,本文主要基于该文件进行相关实现的分析。 首先来看看Go对排序接口的定义,利用Go的interface特性可以轻松实现多种数据类型的排序功能。想要调用sort包的排序功能我们需要实现这个排序接口,排序接口主要定义了三个方法: Len() int: 返回传入数据的总数 Less(i, j int) bool: 返回数组中下标为i的数据是否小于下标为j的数据 Swap(i, j int): 表示执行交换数组...阅读全文
文地址:Golang 源码剖析:fmt 标准库 前言 package main import ( "fmt" ) func main() { fmt.Println("Hello World!") } 标准开场见多了,那内部标准库又是怎么输出这段英文的呢?今天一起来围观下源码吧 ???? 原型 func Print(a ...interface{}) (n int, err error) { return Fprint(os.Stdout, a...) } func Println(a ...interface{}) (n int, err error) { return Fprintln(os.Stdout, a...) } func Printf(format string, a ......阅读全文
Home Menu Go 语言编译过程概述 01 Feb 2019 Golang Go实现原理 编译原理 预备知识 抽象语法树 静态单赋值 指令集架构 编译原理 词法与语法分析 类型检查 中间代码生成 机器码生成 编译器入口 总结 相关文章 Reference Golang 是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解 Go 语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。 这一节会先对 Go 语言编译的过程进行概述,从顶层介绍编译器执行的几个步骤,随后的章节会分别剖析各个步骤完成的工作和实现原理,同时也会对一些需要预先掌握的知识进行介绍和准备,确保后面的章节能够被更好的理解。 预备知识...阅读全文
9e32847ca5bfbfba1946222467fbc7da提示这个乱码是什么意思...阅读全文
1:什么是Linux下的守护进程 Linux daemon是运行于后台常驻内存的一种特殊进程,周期性的执行或者等待trigger执行某个任务,与用户交互断开,独立于控制终端。一个守护进程的父进程是init进程,它是一个孤儿进程,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都被丢到了/dev/null中。守护进程一般用作服务器进程,如httpd,syslogd等。2:进程,进程组,会话,控制终端之间的关系 因为守护进程的创建需要改变这些环境参数,所以了解它们之间的关系很重要: 上图就描述了它们之间的联系: 2.1 进程组:它是由一个或多个进程组成,进程组号(GID)就是这些进程中的进程组长的PID。 2.2 会话:其实叫做会话期(session...阅读全文
兄弟连区块链入门教程go-ethereum源码解析:go-ethereum源码解析因为go ethereum是最被广泛使用的eth客户端, 所以后续的源码分析都从github上面的这份代码进行分析。 搭建go ethereum调试环境 windows 10 64bit首先下载go安装包进行安装 安装好之后,设置环境变量,把C:\Go\bin目录添加到你的PATH环境变量, 然后增加一个GOPATH的环境变量,GOPATH的值设置为你的GO语言下载的代码路径(我设置的是C:\GOPATH) 安装git工具,请参考网络上的教程安装git工具, go语言从github自动下载代码需要git工具的支持 打开命令行工具下载 go-ethereum的代码 go get github.com/ethere...阅读全文
ipfs的御用包管理器 gx入门指南 何为 gx 源码位置:https://github.com/whyrusleeping/gx| 官方称其为一个通用包管理器,构建于 IPFS 之上,gx 最初的设计灵感来自 nodejs 的 npm ,用来处理 golang 项目中的依赖包。如果从源码来欣赏 IPFS 并且心存二次开发的愿望,那么对 gx 的掌握还是非常有必要的。 本人在年初学习 IPFS (v0.4.12) 时并没有重视 gx 这个工具,甚至还在二次开发的过程中放弃了 gx 而改用 govendor 来进行 deps 的管理,这在后期升级 libp2p 时简直就是一场灾难。由于工作需要现在又需要使用 go-libp2p 来做一个 p2p 应用,所以下定决心一定要征服 gx 想要了解更多...阅读全文
RPC 框架在微服务中重要的一部分,熟悉和了解其原理是非常有必要的。Go 语言中源码自带实现了 RPC 功能,虽然官方已经宣布不再更新,但是因它实现简单,代码量不大,很多地方值得学习和借鉴,是阅读 RPC 源码的一个非常好的开始。 源码地址: github.com/golang/go/t… 1. 基本使用 先来看看调用的官方例子: 服务器部分代码: // content of server.go package main import( "net" "net/rpc" "net/http" "errors" "log" ) type Args struct { A, B int } type Quotient struct { Quo, Rem int } type Arith int fu...阅读全文
h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; text-align: justify; page-break-inside: avoid; orphans: 0; widows: 0 } h1.western { font-family: "Times New Roman", serif; font-size: 22pt } h1.cjk { font-family: "宋体" } h1.ctl { font-family: "Times New Roman", serif; font-size: 10pt; font-weight: norm...阅读全文
官方安装指导: https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu 不要在线安装golang,源码进行安装: curl -O https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz mkdir -p ~/go; echo "export GOPATH=$HOME/go" >> /etc/profile echo "export PATH=$PATH:$HOME/go/bin:/usr/local/go/bin"...阅读全文
环境:centos7、postgresql10.6、gitea 1.11 官方文档:https://docs.gitea.io/zh-cn/command-line/ 首先在服务器上配置go基础环境。这里再回顾一下centos下配置go开发环境。 源码编译安装golang 简单点上傻瓜代码流 wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz tar -xvf go1.13.4.linux-amd64.tar.gz -C /usr/local/ vi /etc/profile export GOROOT=/usr/local/go export GOPATH=/root/gopath export PATH=$...阅读全文
本文来自网易云社区1 垃圾回收中的重要概念1.1 定义In computer science, garbage collection (GC) is a form of automatic memory management. The garbage collector, or just collector, attempts to reclaim garbage, or memory occupied by objects that are no longer in use by the program. Garbage collection was invented by John McCarthy around 1959 to simplify manual memory manage...阅读全文
兄弟连区块链教程以太坊源码分析交易数据分析。 交易的数据结构 交易的数据结构定义在core.types.transaction.go中,结构如下: type Transaction struct { data txdata // caches hash atomic.Value size atomic.Value from atomic.Value } 交易的结构体中只有一个data字段,是txdata类型的。其他的hash,size,from都是缓存。txdata结构体定义如下: type txdata struct { AccountNonce uint64 `json:"nonce" gencodec:"required"` Price *big.Int `json:"gasPrice...阅读全文
简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介绍Derek解读-Bytom源码分析-持久化存储LevelDB 作者使用MacOS操作系统,其他平台也大同小异Golang Version: 1.8 LevelDB介绍 比原链默认使用leveldb数据库。Leveldb是一个google实现的非常高效的kv数据库。LevelDB是单进程的服务,性能非常之高,在一台4核Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。 由于Leveldb是单进程服务,不能同时有多个进程进行对一个数据库进行读写。同一时间只能有一个进程,或一个进程多并发的方式...阅读全文
作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 本章介绍Derek解读-Bytom源码分析-持久化存储LevelDB 作者使用MacOS操作系统,其他平台也大同小异Golang Version: 1.8 LevelDB介绍 比原链默认使用leveldb数据库。Leveldb是一个google实现的非常高效的kv数据库。LevelDB是单进程的服务,性能非常之高,在一台4核Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。 由于Leveldb是单进程服务,不能同时有多个进程进行对一个数据库进行读写。同一时间只能有一个进程,或一...阅读全文
0XX API错误 BTM000", "Bytom API Error"非比原标准错误 BTM001", "Request timed out"API请求超时 BTM002", "Invalid request body"非法的API请求体 1XX为网络错误 BTM103", "A peer core is operating on a different blockchain network"区块链网络类型不匹配 2xx是签名相关的错误 BTM200 :"Quorum must be greater than 1 and less than or equal to the length of xpubs“ 需要签名的个数超过实际需求签名的个数 BTM201 :”Invalid xpub f...阅读全文
简介 在Go服务中,对于每个请求,都会起一个协程去处理。在处理协程中,也会起很多协程去访问资源,比如数据库,比如RPC,这些协程还需要访问请求维度的一些信息比如说请求方的身份,授权信息等等。当一个请求被取消或者超时的时候,其他所有协程都应该立即被取消以释放资源。Golang的context包就是用来传递请求维度的数据、信号、超时给处理该请求的所有协程的。在处理请求的方法调用链中,必须传递context,当然也可以使用WithCancel, WithDeadline, WithTimeout或者WithValue去派生出子context来传递。当一个context被取消的时候,其派生出的所有子context都会被取消。包的介绍 Context 在context包中,最核心的就是Context接...阅读全文
一、Go语言简介及开发环境配置 1.Go Go是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。 Go 语言具有很强的表达能力,它简洁、清晰而高效。得益于其并发机制, 用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。 Go 代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。 它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。 特性: 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反射 语言交互性 2.搭建Go开发环境 在https://golang.google.cn/doc/install?download=go1.11.1.darwin-...阅读全文
core.yaml 为ture时,将docker的日志输出到fabric标准输出, attachStdout: false 逆向从链码调用到docker操作源码表 core/container/util/dockerutil.go NewDockerClient core/chaincode/platforms/util/utils.go DockerBuild core/chaincode/platforms/golang/platform.go GenerateDockerBuild core/chaincode/platforms/platforms.go StreamDockerBuild GenerateDockerBuild core/container/controller.g...阅读全文
阅读高质量的开源项目,是提升代码质量的好方法。我就是抱着这种想法,提升自己的golang编程技能。代码库,我选择了2个:应用场景非常熟悉的orm:gorm,毕竟之前写java,用了不少hibernate场景还在学习中的区块链:以太坊的go-ethereum最近阅读go的orm框架gorm,收获颇多。项目作者是中国人,github点赞数量9977(截止2018/8/20日)。gorm名字起的很霸气,应该是:go+orm--->gorm这个意思!gorm源码gorm官网1. go原始的sql操作go原始sql操作比较简单,就是将数据读写到一个变量或者多个变量里面。// from: https://golang.org/src/database/sql/example_test.go var sq...阅读全文
dial.go在p2p里面主要负责建立链接的部分工作。 比如发现建立链接的节点。 与节点建立链接。 通过discover来查找指定节点的地址。等功能。dial.go里面利用一个dailstate的数据结构来存储中间状态,是dial功能里面的核心数据结构。// dialstate schedules dials and discovery lookups.// it get's a chance to compute new tasks on every iteration// of the main loop in Server.run.type dialstate struct {maxDynDials int //最大的动态节点链接数量ntab discoverTable //disco...阅读全文
引言 Go 语言这两年在语言排行榜上的上升势头非常猛,Go 语言虽然是静态编译型语言,但是它却拥有脚本化的语法,支持多种编程范式(函数式和面向对象)。Go 语言最最吸引人的地方可能是其原生支持并发编程(语言层面原生支持和通过第三方库支持是有很大区别的)。Go 语言的对网络通信、并发和并行编程的支持度极高,从而可以更好地利用大量的分布式和多核的计算机。开发者可以通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。 2017年7月 TIOBE 语言排行榜 Go 首次进入前十。今天就让我们来探究探究 Go 的编译命令执行过程。 一. 理解 G...阅读全文
// A response with a representation similar to an HTTP response that can // be used within another message. type Response struct { // A status code that should follow the HTTP status codes. Status int32 `protobuf:"varint,1,opt,name=status" json:"status,omitempty"` // A message associated with the response code. Message string `protobuf:"bytes,2,opt...阅读全文
我们在开发时,有时会碰到一个接口的访问量突然上升,导致服务响应延迟或者宕机的情况。这时,除了利用缓存之外,也可以用到singlefilght来解决,下面是一个简单的示例 package main import ( "fmt" "sync" "sync/atomic" "time" "golang.org/x/sync/singleflight" ) func main() { g := singleflight.Group{} wg := sync.WaitGroup{} for i := 0; i < 100; i++ { wg.Add(1) go func(j int) { defer wg.Done() val, err, shared := g.Do("a", a) if err !...阅读全文
兄弟连区块链入门教程以太坊源码分析event源码分析,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 event包实现了同一个进程内部的事件发布和订阅模式。event.go目前这部分代码被标记为Deprecated,告知用户使用Feed这个对象。 不过在代码中任然有使用。 而且这部分的代码也不多。 就简单介绍一下。数据结构TypeMux是主要的使用。 subm记录了所有的订阅者。 可以看到每中类型都可以有很多的订阅者。 // TypeMuxEvent is a time-tagged notification pushed to subscribers. ty...阅读全文
nat是网络地址转换的意思。 这部分的源码比较独立而且单一,这里就暂时不分析了。 大家了解基本的功能就行了。nat下面有upnp和pmp两种网络协议。upnp的应用场景(pmp是和upnp类似的协议)如果用户是通过NAT接入Internet的,同时需要使用BC、电骡eMule等P2P这样的软件,这时UPnP功能就会带来很大的便利。利用UPnP能自动的把BC、电骡eMule等侦听的端口号映射到公网上,以便公网上的用户也能对NAT私网侧发起连接。主要功能就是提供接口可以把内网的IP+端口 映射为 路由器的IP+端口。 这样就等于内网的程序有了外网的IP地址, 这样公网的用户就可以直接对你进行访问了。 不然就需要通过UDP打洞这种方式来进行访问。p2p中的UDP协议现在大部分用户运行的环境都是内网...阅读全文
验证码已经是非常常用的反作弊、反攻击手段了,其实要实现这个功能对技术水平好的人也不难,但是并不是每个人,每种语言都天然适合搞某个功能...不过我们可以通过封装接口,来屏蔽差异化,把问题简单化,现在就用一个简单的nodejs脚本来实现验证生成功能,例子如下: var http = require('http'); var qs = require('querystring'); //配置您申请的appKey和openId app_key = "***"; open_id = "***"; function request_content(request_url,port,params,method){ var path=request_url; if(!!params){ var conten...阅读全文
从本文开始咱们一起探索 Go map 里面的奥妙吧,看看它的内在是怎么构成的,又分别有什么值得留意的地方? 第一篇将探讨初始化和访问元素相关板块,咱们带着疑问去学习,例如: 初始化的时候会马上分配内存吗? 底层数据是如何存储的? 底层是如何使用 key 去寻找数据的? 底层是用什么方式解决哈希冲突的? 数据类型那么多,底层又是怎么处理的呢? ... 原文地址:深入理解 Go map:初始化和访问元素 数据结构 首先我们一起看看 Go map 的基础数据结构,先有一个大致的印象 hmap type hmap struct { count int flags uint8 B uint8 noverflow uint16 hash0 uint32 buckets unsafe.Pointer ol...阅读全文
请教一个问题:我多个硬件设备通过udp跟服务器连接,他会隔1小时给服务器去上报数据 每个设备是有唯一的标识码IMEI 现在想通过服务器把数据发给指定设备 该怎么操作 之前的做法是 当设备连接服务器时就把UDPAddr的对象存到一个map里 key值为imei号 但是设备连着 第二次发报文后 ip是不会变的 端口变了 我想用WriteToUDP 就找不到接受对象...阅读全文
互联网二十多年,已到十字路口。区块链出现前的互联网被称为古典互联网,而应用区块链技术的互联网才进入了后互联网时代。作为一项新兴的技术,区块链无疑正处于风口浪尖之上,其发展前景于普通大众而言也终将是利好。但目前由于区块链技术处于发展早期阶段,存在技术成熟度、落地应用场景有限等问题,兄弟连教育建议用户在选择专业Go语言+区块链培训机构前应进行仔细考量与辨别。在iterate整个map的时候,使用delete是安全的。这跟c++是不一样的,c++在delete的时候,会导致整棵树发生变化,所以不能在迭代的时候删除元素。那为什么golang的map是安全的呢,从源码来看,golang的map使用了桶的概念,元素是被hash到桶存储,每个桶预设是存储八个kv,而且在头部有一个uint8 tophash...阅读全文
作为golang并发编程思想的重要组成,channel(通道)非常重要,和goroutine(go协程)一起使用,用来实现go的CSP(Communicating Sequential Processes)并发模型。 Do not communicate by sharing memory; instead, share memory by communicating 不要以共享内存的方式来通信,相反,要通过通信来共享内存。 因为channel的重要性,有必要对其原理和源码进行学习,在参考了网络上各种大牛的分享后,将其作为笔记记录下来,如有不足之处,还请指正。 源码路径: go1.11/src/runtime/chan.go channel结构体 type hchan struct { //...阅读全文
IPMaskipmask存储掩码,掩码是指定ip地址中前多少位是网络地址的。type IPMask []byte测试本文链接: https://dreamerjonson.com/2019/01/18/go-network-2-ipmask/版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处! go语言交流2群:71338526...阅读全文
(1)使用方法 timer := time.NewTicker(time.Duration(GAP) * time.Second) for { select { case now := <-timer.C: fmt.Println(now) } } (2)NewTicker 函数 func NewTicker(d Duration) *Ticker { if d <= 0 { panic(errors.New("non-positive interval for NewTicker")) } // Give the channel a 1-element time buffer. // If the client falls behind while reading, we drop tic...阅读全文
分享一个在go tour上看到的练习题,练习里要求用户自己定义一个错误类型,实现error接口,函数在参数不满足条件的时候返回自定义的错误类型的值。练习中特别提示用户不要在实现的Error方法里直接使用fmt.Sprint(e)以避免造成程序内存溢出。 下面贴一下具体的练习题 Practice 从之前的练习中复制 Sqrt 函数,修改它使其返回 error 值。 Sqrt 接受到一个负数时,应当返回一个非 nil 的错误值。复数同样也不被支持。 创建一个新的类型 type ErrNegativeSqrt float64 并为其实现 func (e ErrNegativeSqrt) Error() string 方法使其拥有 error 值,通过 ErrNegativeSqrt(-2).Err...阅读全文
区块链入门教程以太坊源码分析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的快速...阅读全文
具体细节这里有详解,前面都可以按照介绍一步步的来主要卡在3、安装go.tools Binaries这一步上,找了很多资料才找全。首先可以在本地建一个目录来存放这些源码,并将这个目录设为GOPATH,就是将下面这句加入~/.bash_profile中 export GOPATH=$HOME/dev/goapp然后在goapp中建立三个目录bin, pkg, src,将下面这些源码clone在src下 gocodegit clone https://github.com/nsf/gocode.gitgoimports gorename 这两个都在tools下面可以找得到git clone https://github.com/golang/tools.gitgodef git clone htt...阅读全文
golang 中获取字符串个数 在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数 // string is the set of all strings of 8-bit bytes, conventionally but not // necessarily representing UTF-8-encoded text. A string may be empty, but // not nil. Values of string type are immutable. 举个例子,”Hello, 世界“(因为,对比所以用了中文) s := "Hello, 世界" fmt.Pr...阅读全文
引流 : AES 原理 / DES 原理和Golang实现 / 个人主页 参考 : 标准AES-FIPS197 /《深入浅出密码学》 crypto/aes 包 Golang中aes和des采用了相同的设计模式,都实现了cipher.block接口,整体的代码设计思路是类似的。 主要涉及下面三个文件 -aes -cipher.go //提供构造方法,暴露加解密方法 -block.go // Golang加解密的具体实现 -const.go // 定义算法所需要的常量和测试数据 对于包中的其他文件*asm.go , *_gcm.go 是直接操作汇编码进行加解密,前提是操作系统支持。 对于模块中的方法:*Go()表示用纯Go实现的;*Asm()和*Gcm()都是工具人,下面是汇编。 为什么AES整...阅读全文
我这个场景是做优先级的任务派发的,因为有几十个厂商,每个厂商还有不同的业务,每个业务也有10个优先级,这样算来整个任务缓冲池里最少又要几百个队列。 这里没用channel,因为channel通道太多,没法很好的做输出。 优先级肯定是有调度器主动去pop数据,这里选择了使用container/list提供的双端列表。 我的服务主要体现在Push, Pop 类似的操作上,container/list都可以O(1)的时间复杂度。 该文章后续会有更新, 原文地址, http://xiaorui.cc/?p=4809 话题说 list 有个 remove的问题… 你遍历整个链表会发现只会删除第一个,当再次迭代的时候,e.Next() == nil 空值,跳出循环。。。 for e := l.Front...阅读全文
1. 前言:为什么要使用 MQ 消息队列 随着互联网技术在各行各业的应用高速普及与发展,各层应用之间调用关系越来越复杂,架构、开发、运维成本越来越高,高内聚、低耦合、可扩展、高可用已成为了行业需求。 一提到消息队列 MQ(Message Queue),我们会想到很多应用场景,比如消息通知、用户积分增减、抽奖中奖等,可以看出来 MQ 的作用有: 流程异步化、代码解耦合、流量削峰、高可用、高吞吐量、广播分发,达到数据的最终一致性,满足具体的业务场景需求。 本文将从 MQ 比较、NSQ 介绍、源代码逻辑、亮点小结等方面进行解析,以期对 NSQ 有较为深入的理解。 2. 主流 MQ 比较 目前主流的 MQ 有 Kafka, RabbitMQ, NSQ, RocketMQ, ActiveMQ,它们的对...阅读全文
源码目录 //runtime/runtime2.go。 (go 1.12.7) interface分为两类:iface和eface。eface不带方法,iface带方法。可以说所有的类型都属于eface。iface可以转换成eface,而eface不一定能转换成iface。 数据结构 /// runtime/runtime2.go type iface struct { tab *itab data unsafe.Pointer } type eface struct { _type *_type data unsafe.Pointer } iface和eface的结构都很简单。data指向数据值,区别在于tab和_type。我们先看看tab。 itab type itab struct {...阅读全文
总述 nsq是一个实时分布式的消息队列平台。 核心部分是一个叫nsqd的模块,它负责接收和转发消息。同时在go-nsq的包中,提供了consumer和producer的核心接口。在读nsq源码的时候,很好奇它的数据是怎么从producer给到了consumer的,于是从源码的层面梳理了一下代码的实现细节。这部分先记录一下producer和consumer的代码细节,方便后续再查看相关代码。后面准备把nsqd和nsqdlookup相关的东西记录一下,包括数据分发、数据缓存、服务发现等实现细节。 go-nsq里的producer和consumer实现的功能就是一句话,提供消息接受和分发的接口。但是它内部的实现确很有意思。 nsq demo 学习源码还是要先从demo起步,首先装好nsq,可以gi...阅读全文
上一篇初识了 nsq 三个模块(nsqd, nsqlookupd, nsqadmin)的 demo演示,本篇则从源码开始,一步一步去解析 nsqd 的执行流程和逻辑处理,学习别人优秀的项目架构,以期学以致用。 1. nsqd 执行入口 在 nsq/apps/nsqd/main.go 可以找到执行入口文件,如下: 2. nsqd 执行主逻辑源码 2.1 通过第三方 svc 包进行优雅的后台进程管理,svc.Run() -> svc.Init() -> svc.Start(),启动 nsqd 实例; func main() { prg := &program{} if err := svc.Run(prg, syscall.SIGINT, syscall.SIGTERM); err != nil...阅读全文