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

巧妙使用channel实现限流器

普通Limiter 特点:无时间限制,只要不超过数量就可通过 // 基于channel阻塞实现 // 缺点:阻塞无时间限制 type ( ChannelLimiter struct { bufferChannel chan golang.PlaceholderType } ) func NewChannelLimiter(limit int) *ChannelLimiter { return &ChannelLimiter{bufferChannel: make(chan golang.PlaceholderType, limit)} } func (l *ChannelLimiter) Allow() bool { select { case l.bufferChannel <- gola...阅读全文

博文 2020-05-10 23:32:42 Keson

【go共识算法】-Raft

介绍 Raft 状态 一个 Raft 集群包含若干个服务器节点;通常是 5 个,这允许整个系统容忍 2 个节点的失效,每个节点处于以下三种状态之一: follower :所有结点都以 follower 的状态开始。如果没收到 leader消息则会变成 candidate状态。 candidate:会向其他结点“拉选票”,如果得到大部分的票则成为leader。这个过程就叫做Leader选举(Leader Election)。 leader:所有对系统的修改都会先经过leader。 Raft 一致性算法 Raft通过选出一个leader来简化日志副本的管理,例如,日志项(log entry)只允许从leader流向follower。 基于leader的方法,Raft算法可以分解成三个子问题: L...阅读全文

博文 2018-10-10 20:34:39 jincheng828

使用docker构建vim-golang开发环境

使用docker构建vim-golang开发环境 原理 docker可以构建一个属于自己的开发环境容器,需要使用时,下载镜像,开箱即用,避免每次都搭建开发环境,浪费不少的时间。 路线图Road Map vim-golang 开发环境 spacemacs Org-mode --放弃,鸡肋 目的(抓住主要矛盾,围绕目标来展开工作) 搭建基于Docker的开箱即用的,工作和开发环境 支持golang开发 支持TypeScript的开发 需要解决的问题 vim插件vim-airline,状态栏图标不显示 --优先级,低 重新构建devenv-vim镜像,使用dockerfile技术构建,减小体积,去除冗余 如何使用 家里-运行 docker run -itd \ `# 注释请忽略,---------...阅读全文

博文 2019-12-13 21:32:40 笑吧小鸟

为何专注于流媒体领域?PPIO 技术揭秘续篇

在各种音视频应用充斥着市场的时候,毫无疑问,流媒体领域将会非常适合区块链技术进行场景落地。在上一篇文章中,我们主要讨论了 PPIO 的 PCDN 架构,接下来将介绍 PPIO 的中 P2SP 的下载逻辑和 IaaS 层的流量计数。 下载逻辑 上图为 PPIO 的 CDN 和 P2SP 的传输架构图。这里将会重点讲解 PPIO 中 P2SP 的下载逻辑,它主要分三个部分,Buffer 管理,下载状态机,和下载算法。接下来会对这三部分一一解释。 Buffer 管理 Buffer 管理,即理解为本地设备管理着资源情况,从而决定需要下载的 Piece 的优先级。Buffer 管理也是和实际应用场景是相关的,对于流媒体来说,存在一个视频播放位置,播放位置附近的内容就是紧急内容,该内容则会被优先下载。 ...阅读全文

golang 源码学习之WaitGroup

数据结构 //sync/waitgroup.go type WaitGroup struct { noCopy noCopy // 不可复制,只能指针传递 // 对齐的8byte存储状态, 另外4byte存储信号。状态的高32位counter计数器,低32位waiter计数器 // counter未执行完的goroutine。waiter正在等待的goroutine。那么WaitGroup可以放多少goroutine呢?2^32 state1 [3]uint32 } Add //sync/waitgroup.go func (wg *WaitGroup) Add(delta int) { // statep状态(包含counter和waiter计数器),semap信号 statep, sem...阅读全文

博文 2019-10-27 23:32:52 aside section._1OhGeD

Go语言==接口(interface)

7. 接口(interface) 接口本身是调用方和实现放均需要遵守的一种协议,按统一方法命名参数类型和数量来协调逻辑处理。Go语言中使用组合实现对象特性的描述,对象内部使用结构体内嵌组合对象应具有的特性,对外通过接口暴露能使用的特性。Go语言的接口设计是非入侵式的,开发者无需知道哪些类型被实现。而接口实现者只需要知道实现的是什么样子的接口,但无需指明实现哪一个接口。编译器知道接口应该由谁来实现。 非入侵式的设计让接口与实现者真正解耦。编译速度提高。 1.声明接口 + 接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式、类型及结构 ``` //1.1 接口声明格式 //每个接口类型由数个方法组成 type 接口类型名 interface { 方法名1(args[]) 返回值列表1 方法...阅读全文

重新学习web后端开发-004-了解http响应

一个人必须知道该说什么,一个人必须知道什么时候说,一个人必须知道对谁说,一个人必须知道怎么说。——现代管理之父德鲁克 1. http 响应 "/hello"接口的响应内容如下: HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 Date: Tue, 15 Jan 2019 02:56:59 GMT Content-Length: 12 hello, world 其中,第1行是状态行,第2-4行都是响应头,第5行是一个空行,第6行是响应的消息体。 一个http响应包括三个部分: 状态行 响应头 消息体(body)[可选] 1.1 状态行 HTTP/1.1 200 OK 包括三个部分: http版本,这里是1.1 状态码,这里是200...阅读全文

实现Raft协议:Part 0 - 介绍

翻译自Eli Bendersky的系列博客,已获得原作者授权。 本文是系列文章中的序言,本系列文章旨在介绍Raft分布式一致性协议及其Go语言实现。文章的完整列表如下: 序言:介绍(本文) 第一部分:选主 第二部分:指令和日志复制 第三部分:持久性和优化 Raft是一个相对较新的算法(2014),但是已经在业界取到了广泛的应用。最知名的案例应该就是Kubernetes,其中的分布式键值存储组件etcd就依赖了Raft协议。 本系列文章的写作目的,在于描述Raft协议的一个功能完备且经过严格测试的实现方式,并提供一些Raft工作方式的直观理解。这并不是您学习Raft协议的唯一途径。我假定您至少读过Raft论文; 此外,也强烈建议您花时间仔细研究Raft网站上的资源——观看创作者的一两次演讲,鼓...阅读全文

博文 2020-05-06 14:36:21 GuoYaxiang

图解kubernetes调度器SchedulerCache核心源码实现

SchedulerCache是kubernetes scheduler中负责本地数据缓存的核心数据结构, 其实现了Cache接口,负责存储从apiserver获取的数据,提供给Scheduler调度器获取Node的信息,然后由调度算法的决策pod的最终node节点,其中Snapshot和节点打散算法非常值得借鉴 设计目标 数据感知 SchedulerCache的数据从apiserver通过网络感知,其数据的同步一致性主要是通过kubernetes中的Reflector组件来负责保证,SchedulerCache本身就是一个单纯数据的存储 Snapshot机制 当scheduler获取一个待调度的pod,则需要从Cache中获取当前集群中的快照数据(当前此时集群中node的统计信息), 用于后...阅读全文

博文 2020-01-14 11:34:30 代码仔

NSQ学习:流控的实现

消息中间件的pull与push 消息中间件的实现无非两种套路,一种让客户端pull,典型的比如kafka便是如此,而另一种则是push,也就是让客户端不需要做任何操作,只需要做好conn便可以源源不断收到服务端的推送,典型的代表就是我们今天介绍的nsq。 pull的优势在于客户端可以自己做流控,比如客户端想什么时候pull就什么时候pull,不会因为服务端的强迫而接受,但劣势也很明显,如果服务端的生产速度很慢,客户端需要不断的轮询会让cpu处于繁忙且无用的状态。 push的优势则在于能够不受限于客户端的速度,可以让服务端更快的、批量的把数据push给客户端,因此大部分push实现的消息中间件都是属于内存型,而nsq比较特殊,它实际上是内存+磁盘的一个消息中间件。 push流的nsq如何做流控...阅读全文

博文 2019-06-11 01:02:39 imxyb

Golang 中状态和结果总结

操作 通道状态 结果 Read nil 阻塞 打开且非空 读取到值 打开且空 阻塞 已关闭(Closed) <初始空值> 只能写入 编译错误 Write nil 阻塞 打开且满 阻塞 打开且非满 写入成功 已关闭(Closed) panic 只能接收 编译错误 close nil panic 打开且非空 关闭 channel,读取成功,直到通道耗尽,然后读取到默认空值 打开但空 关闭 channel, 读取到默认空值 已关闭(Closed) panic 只能接收 编译错误 close nil panic 打开且非空 关闭 channel,读取成功,直到通道耗尽,然后读取到默认空...阅读全文

博文 2020-05-02 21:32:40 北冢

读阿里人如何写周报一文后,想说点啥

#### 阿里人如何写周报原文连接 ``` https://yq.aliyun.com/articles/747144 ``` 我大概说一下文章重点,大家有时间了也可以阅读,重点来了,如下: ##### 写周报的好处 对管理者来说 1. 周报是最高效的沟通载体(因为管理者管理的人多了,所以....) 2. 有效提升团队信息透明度(大家都知道对方在做啥) 3. 文字是可沉淀的团队无形资产(后续能够回顾,总结) 对员工来说 1. 周报是一次很好的沟通机会(和领导交互,写的好了,领导会回复你) 2. 一次自我回顾总结(把这周的知识再从头思考一下) 3. 重新对齐目标(看看这周做的事是不是和自己之前的目标一直,有没有偏离) ##### 写周报的态度 大概是先说了几乎大多数人都讨厌写周报, 有些领导要...阅读全文

博文 2020-03-20 14:02:59 SunPengWei

Go语言:select 语句块

Golang 的select语句块使 goroutine 等待多个通信操作。 select会进行阻塞,直到其中一种情况可以运行,然后再执行该情况。如果好多个情况都可以执行,它将​​随机选择一个。 如果没有其他情况可用,则会运行选择中的default默认情况。 select { case i := <-c: // use i default: // receiving from c would block } default情况下在 channels 中尝试发送或接收而不会阻塞。 例子: package main import "fmt" func fibonacci(c, quit chan int) { x, y := 0, 1 for { select { case c <- x: x,...阅读全文

博文 2020-03-22 17:32:43 落落大方的发卡

使用BSN开发区块链应用智能合约-golang篇

作者:曹国波 时跃堂智能合约又称链码(Chaincode),是用计算机语言描述合约条款、交易的条件、交易的业务逻辑等,通过调用智能合约实现交易的自动执行和对账本数据的操作。一个BSN应用可以部署多个链码,每个链码包含多个方法。链码支持多种语言编写,包括golang、java、node.js。每个链码程序都必须实现Chaincode接口,链码包含:Init ,Invoke ,Query三个基本操作:▶ Init :链码初始化的方法,在链码实例化或者升级的时候调用一次,以便链码可以执行任何必要的初始化,包括应用程序状态的初始化。▶ Invoke :接收和处理链下业务系统调用事务处理提案,其参数包含调用的链码程序中函数的名称和具体业务处理数据参数。即在Invoke中根据不同的方法参数调用其他分支处...阅读全文

博文 2020-01-16 15:33:44 wx5da979d83cf0a

C和Go相互调用

C可以调用Go,并且Go可以调用C, 如果更进一步呢, C-->Go-->C 或者 Go-->C-->Go的调用如何实现? 本文通过两个简单的例子帮助你了解这两种复杂的调用关系。本文不涉及两者之间的复杂的数据转换,官方文章C? Go? Cgo!、wiki/cgo和cmd/cgo有一些介绍。 Go-->C-->Go Go程序调用C实现的函数,然后C实现的函数又调用Go实现的函数。 1、首先,我们新建一个hello.go的文件: hello.go123456789package mainimport "C"import "fmt"//export HelloFromGofunc HelloFromGo() { fmt.Printf("Hello from Go!\n")} 它定义了一个Hello...阅读全文

博文 2018-09-02 22:17:10 smallnest

go并发编程笔记

go语言高级编程笔记 并发编程 一、并发编程的相关概念 1、并发编程概念:使多个任务【程序】可以在同一时间执行以便能够更快的得到结果 2、多元程序:允许操作系统同时运行多个程序,cpu来回切换,缺点:对系统资源进行无限制的抢夺造成程序频繁发生死锁现象 3、串行程序:只能被顺序执行的指令列表 4、并行程序:可以在并行的硬件上执行的并发程序 5、并发程序:被并发的执行的两个或两个以上的串行程序的统称 6、并发系统 7、并发程序的不确定性:没有明确的执行顺序 8、并发程序的内部交互 同步的原则:某个资源同一时刻只能被一个程序占用 同步的作用:避免在并发访问共享资源时可能存在的冲突,以及确保在互相传递数据时能够顺利的接通 二、多进程编程 1、IPC:多进程程序中,程序之间需要互相协作完成任务,而多个...阅读全文

兄弟连区块链入门教程以太坊源码分析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 17:34:42 兄弟连区块链培训

Bytom设计结构解读

一、引文 设计Bytom 数据结构,组合了许多技术点,如 patricia tree,utxo, bvm, account model,protobuf,sql,memcache 等。本文会对一些技术点做以下两点分析。 Bytom 为什么要采用该技术点? Bytom 如何应用该技术点? 最后介绍综合这些技术点如何实现Bytom。 [patricial tree](http://www.allisons.org/ll/AlgDS/Tree/PATRICIA/) 二、为什么要采用PAT树? •PAT树具有[基数树](https://en.wikipedia.org/wiki... 的特点,内容可快速追踪。 •PAT树具有[merkle树](https://en.wikipedia.org/wik...阅读全文

博文 2018-07-26 16:34:56 比原链Bytom

go-graphql 自定义 Scalar

学习笔记,写这篇笔记时才刚入门golang,希望各路大神多多指点。 场景 假设有一个 Role 模型 type Role struct { Id int Name string Status RoleStatus } 其中RoleStatus类型表示角色的状态: type RoleStatus int const ( RDefault RoleStatus = iota RPublish RBlock RDeleted ) 所以数据库在存储角色状态时是Int型,而使用graphql开发接口想以string类型输出状态 的名称,此时就可以利用自定义Scalar功能。 下面这个map用于存储状态名称值和RoleStatus之间的映射: type RSMapType map[interface{}...阅读全文

博文 2019-07-13 17:32:40 SasukeBo

兄弟连区块链入门教程以太坊源码分析p2p-dial.go源码分析

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 /...阅读全文

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

golang 基础(26)select

golang_real.jpg select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。 func main(){ c1 := make(chan string) c2 := make(chan string) go func(){ time.Sleep(1 * time.Second) c1 <- "one" }() go func(){ time.Sleep( 2 * time.Second) c2 <- "two" }() for i:= 0; i < 2; i++ { select { case msg1 := <- c...阅读全文

golang sync WaitGroup

刚才看golang的sync的包,看见一个很有用的功能。就是WaitGroup。 先说说WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 WaitGroup总共有三个方法:Add(delta int),Done(),Wait()。简单的说一下这三个方法的作用。 Add:添加或者减少等待goroutine的数量 Done:相当于Add(-1) Wait:执行阻塞,直到所有的WaitGroup数量变成0 package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i = i ...阅读全文

博文 2019-01-09 14:34:47 lu566

[Go - Note] Channel 阻塞deadlock和panic情况,以及close channel

阻塞: 发生一直阻塞时,会报如下deadlock错误: fatal error: all goroutines are asleep - deadlock! 无缓存channel: 通道中无数据,但执行读通道。 通道中无数据,向通道写数据,但无协程读取。 有缓存channel: 通道的缓存无数据,但执行读通道。 通道的缓存已经占满,向通道写数据,但无协程读。 Panic: 1.向已经关闭的channel写。2.关闭已经关闭的channel。 close channel: You needn't close every channel when you've finished with it.It's only necessary to close a channel when it is i...阅读全文

博文 2020-02-20 20:32:39 Arboat

使用BSN开发区块链应用智能合约-golang篇

作者:曹国波 时跃堂智能合约又称链码(Chaincode),是用计算机语言描述合约条款、交易的条件、交易的业务逻辑等,通过调用智能合约实现交易的自动执行和对账本数据的操作。一个BSN应用可以部署多个链码,每个链码包含多个方法。链码支持多种语言编写,包括golang、java、node.js。每个链码程序都必须实现Chaincode接口,链码包含:Init ,Invoke ,Query三个基本操作:▶ Init :链码初始化的方法,在链码实例化或者升级的时候调用一次,以便链码可以执行任何必要的初始化,包括应用程序状态的初始化。▶ Invoke :接收和处理链下业务系统调用事务处理提案,其参数包含调用的链码程序中函数的名称和具体业务处理数据参数。即在Invoke中根据不同的方法参数调用其他分支处...阅读全文

博文 2020-01-17 01:32:52 区块链服务网络BSN

兄弟连区块链教程以太坊源码分析core-state-process源码分析(二)

兄弟连区块链教程以太坊源码分析core-state-process源码分析(二):关于g0的计算,在黄皮书上由详细的介绍和黄皮书有一定出入的部分在于if contractCreation && homestead {igas.SetUint64(params.TxGasContractCreation) 这是因为 Gtxcreate+Gtransaction = TxGasContractCreation func IntrinsicGas(data []byte, contractCreation, homestead bool) *big.Int { igas := new(big.Int) if contractCreation && homestead { igas.SetUint6...阅读全文

博文 2018-10-22 16:35:00 兄弟连区块链培训

Tikye(TIY)知识科普之技术架构

设计思路考虑到Tikye对于区块链系统的性能、安全等需求远比一般的公有链性能更高,为了保证交易场景下的公开透明,交易各方皆能参与到区块链的共同监管与治理,同时能兼顾高频交易需要较高的TPS,我们设计了一套支持可插拔、可扩展的高性能应用级区块链系统。在下文中,该区块链系统简称Tikye。该系统为开发者提供便捷的SDK工具包,同时还将为外部系统提供可兼容的API接口,基于Tikye的特性解决传统问题。主要依靠智能合约来解决基于Tikye的事务性问题,智能合约在区块链环境中运行,保证了事务执行的可行性、高效性和安全性。为了区块链系统的处理能力,我们通过引入多条平行链组成链路由系统。平行链和主链保持既独立又统一的关系,所有平行链可以拥有自己的超级节点、状态机和原始交易数据,由主链来存储关键数据以及完...阅读全文

博文 2019-09-19 11:02:46 逗币狗