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

用protobuf生成json结构插件实现

背景json格式不便描述/统一管理在日常中json数据格式应用场景很多。比如在restful请求/返回、业务通信协议、消息(nsq/kafka),广泛使用json。但是目前存在如下问题json数据协议分散在代码里,没有一个统一的描述方式json使用往往使用map结构,然后序列化。造成上下游使用混乱,容易出错如果使用struct方式定义,那么需要手动写代码,很是繁琐比如以下示例:json格式如下: { "id": 123, "name": "fangming", "age": 18, "occ": {"id": 111, "industry": "professor"}, "occs": [ {"id": 111, "industry": "professor"}, {"id": 222, "...阅读全文

博文 2019-06-10 14:06:13 buptbill220

波司登全国超千家门店,销售状况如何实时监控?

摘要: 公司以往一直使用ERP的报表进行数据的展示,近期也上线了以HANA数据库为基础的BO报表进行业务数据支持,但是依然存在数据实时主动展示的缺陷。我们需要的销售业绩数据可以实时通过业绩大盘进行展示,这样可以更加友好的为团队提供数据支撑。 来自 波司登国际控股有限公司 黄金友 的撰稿 1. 需求概述 公司的零售团队存在一个无法实时获取市场的销售业绩数据并有效通过大盘进行展示的痛点。我们在与阿里云的合作过程中,了解了ARMS这款端到端一体化实时监控解决方案的PaaS级阿里云产品,正好可以很好地解决我们零售业务的痛点。我们成功完成了业绩数据的准备及业绩数据的展示。 这里简单分享一下ARMS用于实时业绩数据展示的经验。 公司以往一直使用ERP的报表进行数据的展示,近期也...阅读全文

go 的反射 reflect

Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的reflect包就是反射相关的,只要包含这个包就可以使用。 grpc 的 golang 版本也是靠反射实现的。 reflect 的基本功能 reflect.TypeOf 返回类型 reflect.Type reflect.ValueOf 返回值 reflect.Value 可以从reflect.Value 中获取类型 通过Kind 来判断类型 先看第一个例子 一 、 反射的基本用法 ValueOf用来获取输入参数接口中的数据的值,如果接口为空则返回0 TypeOf用来动态获取输入参数接口中的值的类型,如果接口为空则返回nil // 反射的基础用法 func base00() { var num = 1.23...阅读全文

博文 2019-08-07 08:32:40 OOM_Killer

区块链教程Fabric1.0源代码分析Orderer BroadcastServer

区块链教程Fabric1.0源代码分析Orderer BroadcastServer,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。Fabric 1.0源代码笔记 之 Orderer #BroadcastServer(Broadcast服务端)1、BroadcastServer概述BroadcastServer相关代码在protos/orderer、orderer目录下。protos/orderer/ab.pb.go,AtomicBroadcastServer接口定义。orderer/server.go,go,AtomicBroadcastServer接口实现...阅读全文

博文 2018-11-05 15:35:07 兄弟连区块链培训

数组初始化的性能?

```go package main import ( "fmt" "time" ) func main() { size := 20000 matrix1 := make([][]int, size) for i := 0; i < size; i++ { matrix1[i] = make([]int, size) } start1 := time.Now() // 方法1 for i := 0; i < size; i++ { for j := 0; j < size; j++ { matrix1[i][j] = i + j } } fmt.Println(time.Since(start1)) matrix2 := make([][]int, size) for i := 0; i ...阅读全文

博文 2020-06-02 20:11:18 xmge

兄弟连区块链教程Fabric1.0源代码分析configupdate处理通道配置更新

区块链教程Fabric1.0源代码分析configupdate处理通道配置更新,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 Fabric 1.0源代码笔记 之 Orderer #configupdate(处理通道配置更新) 1、configupdate概述 configupdate,用于接收配置交易,并处理通道配置更新。相关代码在orderer/configupdate目录。 2、SupportManager接口定义及实现 2.1、SupportManager接口定义 type SupportManager interface { GetChain(cha...阅读全文

博文 2018-11-05 15:35:07 兄弟连区块链培训

再测Golang JSON类库

写项目一直需要进行序列化,听到了,也看到了很多同学老师对各个golang的json库进行测评。那本人为什么还要继续进行这一次测评呢?因为实践过的知识最有说服力,也是属于自己的,我也希望看到本博文的同学老师可以修改和执行测评的代码执行一遍,我相信会有不一定的体会。本次测评我选择了类库有: 类库 序号 类库 地址 备注 1 encoding/json Golan 2 easyjson github.com/mailru/easyjson 3 ffjson github.com/mailru/easyjson 4 iterator/json github.com/json-iterator/go 主要是针对上述的类型进行,本人采用了对不同的类库使用不同的结构体(仅仅是结构体名称不同,字段顺序和类型...阅读全文

博文 2018-07-02 12:23:23 梦朝思夕

[译]理解Go的reflect

文:medium.com/better-prog… Go是一个强类型的静态编程语言。然而,一些Go的特性让它看起来又像是一门动态语言。例如,如果你不确定你接收的参数的类型,你可以使用interface来接收所有类型的参数传递。 记住只有interface是有reflect属性的。 我们注意到interface允许Go实现多态。没有任何一种类型是特别需要强调的。可以是string int64 float32 甚至是集合(array/map)。但计算机运行这些代码时候,reflect帮助检查,修改其自身的结构与行为。这个过程允许我们知道对象的类型以及内存在运行时的结构。 我们为什么需要reflect? 允许提前定义参数类型(通常发生在暴露的API上) 函数能根据传参动态执行 reflect的缺点...阅读全文

博文 2019-11-07 00:04:22 野生程序元

区块链教程Fabric1.0源代码分析blockfile区块文件存储2

//构造blockIndex func newBlockIndex(indexConfig *blkstorage.IndexConfig, db *leveldbhelper.DBHandle) *blockIndex //获取最后一个块索引(或编号),取key为"indexCheckpointKey"的值,即为最新的区块编号 func (index *blockIndex) getLastBlockIndexed() (uint64, error) func (index *blockIndex) indexBlock(blockIdxInfo *blockIdxInfo) error //索引区块 //根据区块哈希,获取文件区块指针 func (index *blockIndex) g...阅读全文

博文 2018-10-11 15:35:09 兄弟连区块链培训

数人云|90%产品服务化,细说豆瓣的5年变革之路

背景 今天主要分享下微服务中的Auto Scale,豆瓣2005年3月上线,是一家历史比较悠久的互联网公司,主要覆盖文化综合领域的Web、APP等各种产品,现在有豆瓣读书、豆瓣电影、豆瓣音乐等等。 Markdown 〓 豆瓣简介 在技术方面,豆瓣主要的开发语言是Python和Golang,豆瓣拥有自研私有云平台Douban App Engine(以下简称“DAE”),上面托管豆瓣网所有应用使用配置来描述应用:应用依赖MQ、Daemon,以及Cron,这样开发者使用一个配置文件就可以描述对资源的所有需求,平台拿到描述文件后可以在上面做需要的资源管配。 Markdown 〓 Douban App Engine 在DAE上会统一调度所有资源,产品开发人员不必关心具体的机器设备,比如无需关心某个业务...阅读全文

博文 2017-09-30 04:04:59 数人云

Protobuf 小试牛刀

本文以PHP为例。 环境: CentOS 6.8 proto 3.8 PHP 7.1.12 PHP protobuf扩展 3.8.0 go1.12.5 linux/amd64 本文示例仓库地址: https://github.com/52fhy/prot... 是什么 Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。 官方文档:https://github.com/protocolbu... 作为数据交换协议,常见的还有JSON、XML。相比JSON,Protobuf有更高的转化效率。一般JSON用于HTTP接口,Protobuf用于RPC比较多。以gRPC为例,默认就是使用Protobuf。 我们可以使用Protobuf: 作为...阅读全文

博文 2019-07-07 14:32:37 飞鸿影

golang结构体json的时间格式化解决方案

最近开发项目时候发现一个结构体的Json转换的时间格式问题。即这种1993-01-01T20:08:23.000000028+08:00 这种表示UTC方法。从我们习惯来说,更喜欢希望的是1993-01-01 20:08:23这种格式。重新复现代码如下:package main import ( "time" "encoding/json" ) type Student struct { Name string `json:"name"` Brith time.Time `json:"brith"` } func main() { stu:=Student{ Name:"qiangmzsx", Brith:time.Date(1993, 1, 1, 20, 8, 23, 28, time.L...阅读全文

博文 2018-07-02 12:19:04 梦朝思夕

兄弟连区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一

区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 # Fabric 1.0源代码笔记 之 Tx(Transaction 交易) ## 1、Tx概述 Tx,即Transaction,交易或事务。 Tx代码分布目录结构如下: * protos/common/common.pb.go,交易的封装即Envelope结构体。也包括Payload、Header、ChannelHeader和SignatureHeader。 * protos/utils目录,交易相关部分工具函数,包括txutils....阅读全文

博文 2018-11-08 15:52:38 ITXDL

[Go基础]Json在Go中的使用

前言 本文主要根据Go语言Json包[1]、官方提供的Json and Go[2]和go-and-json[3]整理的。 Marshal Marshal提供对数据进行Json序列化的功能: func Marshal(v interface{}) ([]byte, error) type Message struct { Name string Body string Time int64 } m := Message{"Alice", "Hello", 1294706395881547000} b, err := json.Marshal(m) //result b == []byte(`{"Name":"Alice","Body":"Hello","Time":12947063958815...阅读全文

博文 2019-08-29 03:32:45 TOMOCAT

海量用户及时通讯系统

需求分析 用户注册 用户登录 显示用户在线的用户列表 群聊 点对点聊天 离线留言 界面设计 界面设计 项目开发前技术储备 项目要保存用户信息和消息数据,因此我们需要学习数据库(redis或者是MySQL)这里我们选择Redis go中使用redis Redis的基本介绍 redis是nosql型数据库 不是关系型数据库 Redis是远程字典服务器,性能比较高,单机性能高,适合做缓存,也可以持久化 是完全开元免费的,高性能的分布式内存数据库 redis的操作指令 redis的操作指令 操作指令 redis的基本使用 添加key-val [set] 获取当前redis所有key的值 [key *] 获取key对应的值[get key] 切换redis数据库[select index] 如何查看当...阅读全文

博文 2020-04-11 17:33:01 乔大叶_803e

[译]自定义Go Json的序列化方法

编译自 Custom JSON Marshalling in Go。 我们知道,通过tag,可以有条件地实现定制Go JSON序列化的方式,比如json:",omitempty", 当字段的值为空的时候,我们可以在序列化后的数据中不包含这个值,而json:"-"可以直接不被JSON序列化,如果想被序列化key-,可以设置tag为json:"-,",加个逗号。 如果你为类型实现了MarshalJSON() ([]byte, error)和UnmarshalJSON(b []byte) error方法,那么这个类型在序列化反序列化时将采用你定制的方法。 这些都是我们常用的设置技巧。 如果临时想为一个struct增加一个字段的话,可以采用本译文的技巧,临时创建一个类型,通过嵌入原类型的方式来实现。...阅读全文

博文 2020-03-21 21:51:03 smallnest

图解kubernetes中的api多版本机制实现

在web开发中随着版本的更新迭代,通常要在系统中维护多个版本的api,多个版本的api在数据结构上往往也各不相同,今天就来一起学习下kubernetes中的Scheme机制是如何解决这个问题的,如何借助HTTP请求里面的数据进行反序列化操作 1. web请求的处理流程 1.1 HTTP请求处理流程 通常首先是webServer先进行Http协议的处理,然后解析成基础的webServer内部的一个Http请求对象, 通常该对象持有对应请求的请求头和底层对应的字节序列(从socket流中读取)接着首先会通常根据对应的编码格式来进行反序列化,完成从字节序列到当前接口的业务模型的映射, 然后在交给业务逻辑处理,从而最终进行持久化存储, 本文的重点也就在反序列化部分 2.模型映射的实现 2.1 描述资...阅读全文

使用golang反向代理统计api访问次数

前言 今天写点有趣的小东西。事情是这样的,我经常看到有些软件加了统计数据的sdk,之后就可以实现统计接口的访问量,接口负载等等数据。而这些功能不需要原有的软件做些什么,对原来的业务完全无入侵,我觉得这样的功能很有实用性,所以没有参考其他类似的软件或者工具,我想自己试试怎么实现这样的功能。 思路 首先,我们先给要做的工具起个名字,就叫monitor。要实现无侵入,那么只能是在业务软件外面套一层,经由业务软件的流量,都需要经过monitor这一层,这让人很容易得想到了网关的功能也是类似的。恰好,golang实现反向代理十分简单。所以,思路就有了。先实现一个反向代理,将经由业务的流量都由monitor反向代理给业务软件。接着,将访问的api放进通道中,对api进行分类,就可以统计api的访问量了。...阅读全文

博文 2020-03-15 15:32:43 onepunchgo

grpc学习交流探讨

问题一:gRPC究竟是什么?他究竟有什么用么?答:在gRPC里客户端应用可以像调用本地对象一样直接调用另一台不同机器上服务端应用的方法,使得你能够更容易地创建分布式应用和服务。问题二:Golang中原生支持rpc,他和grpc是什么个关系?答:这里还是首先来介绍一下RPC吧,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议。在GO中,标准库提供的net/rpc包实现了RPC协议需要的相关细节,开发者可以很方便的使用该包编写RPC的服务端和客户端程序。然后这里我们在继续介绍一下grpc吧,grpc是一个高性能,开源,通用的rpc框架。默认采用protocol buffers数据序列化协议,支持多种开发语言。那么现在我们就应该明白了,grpc相当于对rpc进行...阅读全文

博文 2020-02-18 11:32:43 盈朔

Go学习笔记(五)

I/O小练习 package main import ( "fmt" "os" "reflect" ) // 定义一个Data结构体 type Data struct { } // 声明Data结构体的成员函数String() func (self Data) String() string { return "data" } func main() { fmt.Println("Hello World!") // 格式化浮点数(转换成字符串) str := fmt.Sprintf("%f", 3.14159) fmt.Println(reflect.TypeOf(str)) fmt.Println(str) // 向屏幕输出"A\n" fmt.Fprint(os.Stdout, "A\n"...阅读全文

博文 2019-08-07 15:32:46 _sign

使用Java SDK实现离线签名

严格来说,tx-signer并不属于SDK,它是bytomd中构建交易、对交易签名两大模块的java实现版。因此,若想用tx-signer对交易进行离线签名,需要由你在本地保管好自己的私钥。 如果你的目的是完全脱离于bytomd全节点,可能需要自己做更多额外的工作。比如,在构建交易时,需要花费若干个utxo(Unspent Transaction Output)作为交易的输入,如果没有全节点则需要自身来维护utxo。当使用tx-signer构建完成一笔交易并签名后,若没有全节点的帮助,也需要自己实现P2P网络协议将交易广播到其他节点。 本文不会对以上技术细节进行讨论,而是利用bytomd全节点查询可用的utxo构建交易,对交易进行签名并序列化后,同样使用bytomd提交交易。 准备工作 将M...阅读全文

博文 2019-03-27 16:34:47 比原链Bytom

高效生成JSON串——json-gen

概述 游戏服务端的很多操作(包括玩家的和非玩家的)需要传给公司中台收集汇总,根据运营的需求分析数据。中台那边要求传过去的数据为 JSON 格式。一开始我们使用 golang 标准库中的encoding/json,发现性能不够理想(因为序列化使用了反射,涉及多次内存分配)。由于数据原始格式都是map[string]interface{},且需要自己一个字段一个字段构造,于是我想可以在构造过程中就计算出最终 JSON 串的长度,那么就只需要一次内存分配了。 使用 下载: $ go get github.com/darjun/json-gen 复制代码导入: import ( jsongen "github.com/darjun/json-gen" ) 复制代码使用起来还是比较方便的: m := ...阅读全文

兄弟连区块链教程Fabric1.0源代码分析Tx(Transaction 交易)二

## 4、交易相关部分工具函数(protos/utils包) putils更详细内容,参考:Fabric 1.0源代码笔记 之 putils(protos/utils工具包) ## 5、RWSet(读写集) RWSet更详细内容,参考:Fabric 1.0源代码笔记 之 Tx #RWSet(读写集) ## 6、version.Height结构体及方法 ```go type Height struct { BlockNum uint64 //区块编号 TxNum uint64 //交易编号 } func NewHeight(blockNum, txNum uint64) *Height //构造Height func NewHeightFromBytes(b []byte) (*Height,...阅读全文

博文 2018-11-08 16:04:00 ITXDL

兄弟连区块链教程Fabric1.0源代码分析blockfile区块文件存储一

Fabric 1.0源代码笔记 之 blockfile(区块文件存储) 1、blockfile概述 blockfile,即Fabric区块链区块文件存储,默认目录/var/hyperledger/production/ledgersData/chains,含index和chains两个子目录。其中index为索引目录,采用leveldb实现。而chains为各ledger的区块链文件,子目录以ledgerid为名,使用文件系统实现。区块文件以blockfile_为前缀,最大大小默认64M。 blockfile,相关代码集中在common/ledger/blkstorage/fsblkstorage目录,目录结构如下: blockfile_mgr.go,blockfileMgr和checkpo...阅读全文

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

第二十八章:Go语言与Protobuf

1. Protobuf 介绍 Protobuf 是 Protocol Buffers 的简称 ,是Google开源的的一种数据描述语言,其初始定位类似于 XML 和 json 等数据描述语言,Protobuf 最常见的使用场景是用于RPC系统中,这是因为protobuf 是一种轻便高效的结构化数据存储格式,可以序列化,比较适合做数据存储或者RPC数据交互格式 2. Protobuf 特点 **优点 : ** protobuf 以高效二进制存储,占用空间比 XML 小 3~10倍,解析速度快 20 ~ 100倍 代码生成机制 多编程语言支持 兼容性比较好 缺点 : 可读性差,调试相对困难 想了解 protobuf 具体详情 参考如下 : https://developers.google.co...阅读全文

博文 2020-01-05 19:32:40 captain89

golang使用json格式实现增删查改

需求和思路 在一般的小项目或者一个小软件,例如客户端之类的小程序中,可能会需要数据的持久化.但是使用一般的数据库(Mysql)之类的不合适.使用sqlite3这种嵌入式的是个较好的方法,但是Go语言中sqlite3的库是C语言的,Cgo不支持跨平台编译.正是由于这种需求,才想到使用json格式将数据直接保存在文件中.具体的思路是怎么样呢? 在Go语言中如果要将数据转化成json格式的话,有两种格式 struct 和 map. 如果同时需要增删查改功能的话,将map作为中间格式是比较合适的.接下来我们就来实现它. 查询操作 这种操作的实现比较简单,直接将文件中的数据读取出来,使用json库反序列化就可以了. 代码如下 : type Product struct { Name string `j...阅读全文

博文 2020-05-21 11:32:45 xingyys

2018-10-12

微服务 :就是微小紧凑的服务, 提供统一简捷的 API 供外部访问, 实现一组独立的功能. go-micro PRC: 远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。gPRCProtocol Buffers:一款平台无关,语言无关,可扩展的序列化数据格式,参考xml,但更小,更快,更简单。只要定义好数据结构,就可以用各个语言生产对应的语言版本。内部数据是纯二进制格式。ETCD: Etcd的目标是构建一个高可用的分布式键值(key-value数据库) ,etcd内部使用了raft这个一致性算法利用golang实现微服务简单介...阅读全文

博文 2018-10-12 22:34:40 李腾_db67

Go语言学习笔记(3)

数组 Golang 中,数组是值类型。 数组的声明 var arr [10]int 数组的初始化 var arr1 [3]int = [3]int{1, 2, 3} var arr2 = [3]int{4, 5, 6} var arr3 = [...]int{7, 8, 9} var arr4 = [...]int{1: 100, 2: 200, 3: 300} 用 for-range 遍历数组 基本语法: for index, value := range 数组变量{ } 其中:index 为数组下标,value 是该下标位置的值。 长度是数组类型的一部分 长度是数组类型的一部分,就是说数组不可以脱离长度而存在。听起来不太明白,我们来看下面的一个示例就明白了,这真的是一个大坑。 假设,我们...阅读全文

博文 2019-01-30 10:34:45 丹枫无迹

go 和 json ------ 对官方博客的一种翻译

介绍: json 是一种常见的数据交互模式, 从语法来看, 他类似于javascript 的 对象和列表。 通常情况下, json 被用于在web 后端服务器和 运行在浏览器上的js 程序进行通信, 偶尔, 该数据结构也用被其他地方用于通信。 你可以使用json 包在你的go 程序中非常简单的读写json. 编码: 编码json 数据可以使用 Marshal 函数 func Marshal(v interface{}) ([]byte, error) 下面给出go 数据结构: Message type Message struct { Name string Body string Time int64 } 和 Message 的实例: m m := Message{"Alice", "He...阅读全文

博文 2019-06-03 18:31:16 tangpeng

用 Golang 实现基于 Redis 的安全高效 RPC 通信

前言 RPC(Remote Procedure Call),翻译过来为“远程过程调用”,是一种分布式系统中服务或节点之间的有效通信机制。通过 RPC,某个节点(或客户端)可以很轻松的调用远端(或服务端)的方法或服务,就像在本地调用一样简单。现有的很多 RPC 框架都要求暴露服务端地址,也就是需要知道服务器的 IP 和 RPC 端口。而本篇文章将介绍一种不需要暴露 IP 地址和端口的 RPC 通信方式。这种方式是基于 Redis BRPOP/BLPOP 操作实现的延迟队列,以及 Golang 中的 goroutine 协程异步机制,整个框架非常简单和易于理解,同时也很高效、稳定和安全。这种方式已经应用到了 Crawlab 中的节点通信当中,成为了各节点即时传输信息的主要方式。下面我们将从 Cr...阅读全文

博文 2020-03-16 22:32:46 MarvinZhang

Golang | json

一、解析JSON 1、解析JSON有两种方法 解析到结构体中(需要提前知道结构体的结构); 解析到接口; 2、JSON数据与struct字段是如何相匹配的 首先查找tag(标签)中,含有Foo的可导出的struct字段(若标签不匹配,则匹配失败) 其次查找,字段名是Foo的导出字段 最后查找类似FOO或者FoO这样的除了首字母之外其他大小写不敏感的导出字段 注意:当接收到一个很大的JSON数据结构而你只想获取其中的部分数据的时候,只需将想要的数据对应的字段名大写,即可轻松解决这个问题。 3、匹配流程 tag——Foo——FOO或FoO或FOo 4、tag注意事项 字段的tag是“-”,直接忽略该字段 tag中如果带有“omitempty”选项,那么如果该字段值为空,则忽略该字段(json编码...阅读全文

博文 2020-04-06 00:34:22 _Liu_

golang[43]-blockchain-serialize

真实比特币序列化参考资料:https://www.blockchain.com/btc/block/00000000000000000a1f57cd656e5522b7bac263aa33fc98c583ad68de309603本文链接: https://dreamerjonson.com/2018/12/12/golang-43-blockchain-serialize/版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处...阅读全文

博文 2019-02-21 15:36:10 jonson_jackson

用 Golang 实现基于 Redis 的安全高效 RPC 通信

前言 RPC(Remote Procedure Call),翻译过来为“远程过程调用”,是一种分布式系统中服务或节点之间的有效通信机制。通过 RPC,某个节点(或客户端)可以很轻松的调用远端(或服务端)的方法或服务,就像在本地调用一样简单。现有的很多 RPC 框架都要求暴露服务端地址,也就是需要知道服务器的 IP 和 RPC 端口。而本篇文章将介绍一种不需要暴露 IP 地址和端口的 RPC 通信方式。这种方式是基于 Redis BRPOP/BLPOP 操作实现的延迟队列,以及 Golang 中的 goroutine 协程异步机制,整个框架非常简单和易于理解,同时也很高效、稳定和安全。这种方式已经应用到了 Crawlab 中的节点通信当中,成为了各节点即时传输信息的主要方式。下面我们将从 Cr...阅读全文

博文 2020-03-17 10:34:29 MarvinZhang

第二章 九析带你轻松完爆 go - vscode 集成开发环境

1 前言 使用 vscode 作为 go 语言的开发环境,vscode 下载和安装过程就不介绍了,直接下二进制包然后图形化安装即可。2 下载 go 语言支持包 选择 vscode 的扩展菜单(extensions),填写 go,然后选择安装:3 编写 hello world 根据我上章内容设置 GO 项目结构,然后用 vscode 打开目录,比如我的目录结构如下:$GOPATH/src/jiuxi.org/jiuxi/helloworld 创建 main.go 文件,内容如下:4 编译 hello world4.1 项目根目录下编译 直接在项目根目录下执行如下语句进行编译:go build 编译成功会生成以项目名称命名的可执行文件: 如果想执行可执行文件名,需要添加 -o 参数:go bui...阅读全文

剥开比原看代码04:如何连上一个比原节点

作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockc... 在上一篇我们已经知道了比原是如何监听节点的p2p端口,本篇就要继续在上篇中提到的问题:我们如何成功的连接上比原的节点,并且通过身份验证,以便后续继续交换数据? 在上一篇中,我们的比原节点是以solonet这个chain_id启动的,它监听的是46658端口。我们可以使用telnet连上它: $ telnet localhost 46658 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. ט�S��%�z...阅读全文

博文 2018-07-23 15:34:49 比原链Bytom

Protocol Buffer在Node.js中的应用

1. Protocol Buffer 简介 先引用官网的一段话: Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data t...阅读全文

博文 2020-04-01 05:32:42 前端艾希

风中的 FAQ-2

51.go modules依赖管理 简介 一般从GOPATH、vendor文件夹下寻找依赖包。使用该功能后根据go.mod文件中的记录下载依赖。 go.mod中使用//作为注释 module:定义当前模块和包路径 require:定义依赖的模块和版本 exclude:排除特定模块和版本的使用 replace:模块源的替换 使用 go get xxx会自动将依赖模块添加到go.mod文件中 网络访问不了golang.org/x等谷歌扩展包,可以使用replace replace ( golang.org/x/crypto => github.com/golang/crypto latest golang.org/x/sys => github.com/golang/sys latest ) g...阅读全文

博文 2019-07-12 14:32:44 我就是小政政

图解kubernetes中的api多版本中反序列化与转换

在之前的文章中分析过kubernetes是如何进行多版本管理中提到了一个关键的设计解码器, 负责将请求对象反序列化成一个具体的数据模型,今天一起来了解下其内部是如何实现多版本管理、转换的设计要点 1.版本化管理的关键设计 1.1 从拓扑转换到星状转换 在通常的web开发中更多的时候,大家都是断代向前兼容更新,大多数情况下当版本更新之后会独立演进,如果要在多版本之间转换通常则会出现如下的情况如果我们要为每个版本都去适配其他所有的版本,则复杂度会指数级上升,而在kubernetes中则通过一个内部版本的设计来进行解决,内部版本是一个稳定的版本,所有的版本都只针对目标版本来进行转换的实现,而不关注其他版本 1.2 兼容设计之转换 那如果谋个版本需要独立的演进,或者增设一些新的字段,修改字段名称等破...阅读全文

博文 2020-03-03 14:32:45 仔仔

reflect反射的实际中的应用及畅想

文地址[https://mojotv.cn/go/golang-reflect-string] 1. ???? 解决了什么 我有很多行日志数据单行的格式是这样的 HOST;000012000629948340196501;ipv4;3; ips: user_id=2;user_name=172.21.1.102;policy_id=1;src_mac=52:54:00:62:7f:4a;dst_mac=58:69:6c:7b:fa:e7;src_ip=172.21.1.102;dst_ip=172.22.2.3;src_port=48612;dst_port=80;app_name=网页浏览(HTTP);protocol=TCP;app_protocol=HTTP;event_id=1310...阅读全文

Go语言(十五) 反射

反射 变量介绍 变量的内在机制 类型信息,这部分是元信息,是预先定义好的 值类型,这部分是在程序运行过程中动态改变的 反射介绍 反射与空接口 空接口可以存储任何类型的变量 在程序运行时动态获取变量的类型信息和值信息,就叫反射 import ( "fmt" "reflect" ) func TestType(a interface{}) { //获取类型(静态信息) t := reflect.TypeOf(a) kind := t.Kind() switch kind { case reflect.Int: fmt.Printf("a is a int\n") a = 2 case reflect.String: fmt.Printf("a is a string\n") } fmt.Prin...阅读全文

博文 2020-04-23 16:33:23 wx5b285b48ed74e

Go 每日一库之 sjson

简介 在上一篇文章中我们介绍了如何使用gjson快速读取 JSON 串中的值。为了内容的完整性,今天我们介绍一下如何使用sjson快速设置 JSON 串中的值。 快速使用 先安装: $ go get github.com/tidwall/sjson 复制代码后使用: package main import ( "fmt" "github.com/tidwall/sjson" ) const json = `{"name":{"first":"li","last":"dj"},"age":18}` func main() { value, _ := sjson.Set(json, "name.last", "dajun") fmt.Println(value) } 复制代码上面代码通过sjso...阅读全文

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

前篇 一个TCP长连接设备管理后台工程(一) 一个TCP长连接设备管理后台工程(二) 一个TCP长连接设备管理后台工程(三) 一个TCP长连接设备管理后台工程(四)一个TCP长连接设备管理后台工程(五) Github仓库地址 封包器 上面介绍了过滤器,过滤器实际就是一个能够处理粘包和拆包的解析器,和封包器的作用正好相反。但是封包器会很简单,因为封包没有粘包和拆包的处理。 代码如下: //Packer is proto Packer api func Packer(msg Message) []byte { data := make([]byte, 0) tempbytes := codec.Word2Bytes(msg.HEADER.MID) data = append(data, temp...阅读全文

博文 2019-12-31 15:32:41 qiuzhiqian

Go语言入门(六)结构体后续&指针

结构体后续&指针 指针 变量和内存地址 每个变量都有内存地址,可以通过变量来操作对应的内存 func varMem() { var a int32 = 100 fmt.Printf("addr %p\n",&a) } func pointMem() { var b int32 b = 32 var a *int32 fmt.Printf("addr of a:%v\ntype of a %T\n",a,a) //取出a的地址和类型 a = &b fmt.Printf("a %d addr:%p\ntype of a:%T\nb %d addr %p\n",*a,&a,a,b,&b) } 指针的定义与取值 &: 取地址 *: 取指针对应的值 充分判断指针为nil的情况 func pointMe...阅读全文

博文 2020-03-26 23:33:13 wx5b285b48ed74e