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

golang中time包用法

time包中包括两类时间:时间点(某一时刻)和时常(某一段时间) 1时间常量(时间格式化) const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone RFC850 = "Monday, 02-Jan-06 15:04:05 MST" RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST...阅读全文

博文 2015-06-18 19:00:34 chenbaoke

深入理解GO时间处理(time.Time)

1. 前言时间包括时间值和时区, 没有包含时区信息的时间是不完整的、有歧义的. 和外界传递或解析时间数据时, 应当像HTTP协议或unix-timestamp那样, 使用没有时区歧义的格式, 如果使用某些没有包含时区的非标准的时间表示格式(如yyyy-mm-dd HH:MM:SS), 是有隐患的, 因为解析时会使用场景的默认设置, 如系统时区, 数据库默认时区可能引发事故. 确保服务器系统、数据库、应用程序使用统一的时区, 如果因为一些历史原因, 应用程序各自保持着不同时区, 那么编程时要小心检查代码, 知道时间数据在使用不同时区的程序之间交换时的行为. 第三节会详细解释go程序在不同场景下time.Time的行为. 2. Time的数据结构go1.9之前, time.Time的定义为 ty...阅读全文

博文 2017-12-18 05:57:14 hanjm

golang高性能日志库zap配置示例

golang高性能日志库zap配置示例 zap是uber开源的Go高性能日志库,gitlab地址 安装 go get -u go.uber.org/zap 请注意,zap仅支持两个最新的Go版本。 示例 简单示例 格式化输出 package main import ( "go.uber.org/zap" "time" ) func main() { // zap.NewDevelopment 格式化输出 logger, _ := zap.NewDevelopment() defer logger.Sync() logger.Info("无法获取网址", zap.String("url", "http://www.baidu.com"), zap.Int("attempt", 3), zap....阅读全文

博文 2019-01-02 19:34:47 阿甘__

Go_Json_Unmarshal_Marshal

Go按照RFC 4627的标准实现了一个json编解码的标准库 func Unmarshal(data []byte, v interface{}) error Unmarshal用于反序列化json的函数 根据data将数据反序列化到传入的对象中 仔细查看代码中的四种情况 1 将json反序列化成struct对象 2 将json反序列化到可以存储struct的slice中 3 将json 反序列化到map中 4 将json反序列化到slice中 package main import ( "encoding/json" "fmt" ) func main() { type Person struct { Name string Age int Gender bool } //unmarsh...阅读全文

博文 2014-10-31 14:00:09 u012807459

golang json 处理的一些例子代码

json 处理的例子代码, 解析结果看后面注释。 package main import "encoding/json" import "fmt" import "os" type Response1 struct { Page int Fruits []string } type Response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"` } type CommonArg struct { SessionId int64 `json:",string"` Op string `json:"Op,omitempty"` AppId string `json:"appId,omitempty"` Onlin...阅读全文

博文 2015-02-10 03:00:00 ghj1976

Go语言如何深度拷贝对象

深度复制可以基于reflect包的反射机制完成, 但是全部重头手写的话会很繁琐. 最简单的方式是基于序列化和反序列化来实现对象的深度复制: func deepCopy(dst, src interface{}) error { var buf bytes.Buffer if err := gob.NewEncoder(&buf).Encode(src); err != nil { return err } return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst) } Gob和bytes.Buffer简单组合就搞定了. 当然, Gob的底层也是基于reflect包完成的. 在内存中序列化,反序列化对象实体 来完成对象实体的深...阅读全文

博文 2016-04-29 16:00:01 hittata

Thrift RPC 使用指南实战(附golang&PHP代码)

Thrift RPC 框架指南 认识Thrift框架 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。 thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。 thrift允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。 类似Thrift的工具,还有Av...阅读全文

博文 2015-05-18 12:00:33 grassroots2011

golang 格式化时间为字符串

package main import ( "fmt" "reflect" "time" ) func main() { //格式化字符串为时间 test, _ := time.Parse("2006-01-02", "2013-11-11") //时间增加 after, _ := time.ParseDuration("15m") fmt.Println(test) test = test.Add(after) fmt.Println(test) //格式化时间为字符串 t3 := test.Format("2006-01-02 15:04:05") fmt.Println(t3) //格式化时间为字符串,只保留年月日 t3 = test.Format("2006-01-02") fmt....阅读全文

博文 2014-10-04 19:26:12 forrestsun

Go官方库RPC开发指南

Go官方提供了一个RPC库: net/rpc。包rpc提供了通过网络访问一个对象的方法的能力。服务器需要注册对象, 通过对象的类型名暴露这个服务。注册后这个对象的输出方法就可以远程调用,这个库封装了底层传输的细节,包括序列化。服务器可以注册多个不同类型的对象,但是注册相同类型的多个对象的时候回出错。 我最近写了一本电子书: Go RPC开发指南,介绍Go RPC开发的相关技术,这是其中的一章,专门介绍官方库 net/rpc的使用。 同时,如果对象的方法要能远程访问,它们必须满足一定的条件,否则这个对象的方法回呗忽略。 这些条件是: 方法的类型是可输出的 (the method's type is exported) 方法本身也是可输出的 (the method is exported) 方法...阅读全文

博文 2016-09-18 17:00:02 colobu

golang time 格式化 format

名词 MarshalJSON 序列化:意思是将某种结构转化为字符串格式 UnmarshalJSON 反序列化:意思是将字符串形式转化为某种结构形式 golang的时间格式 默认采用的是RFC3339,与我们常认知的格式不同,故需要转化,但是这个转化目前也有点麻烦,一种方法是重写两个接口(marshaljson跟unmarshaljson)方法。如下: package main import ( "encoding/json" "fmt" "time" ) type JSONTime struct { time.Time } func (t *JSONTime) MarshalJSON() ([]byte, error) { // 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法...阅读全文

博文 2019-07-28 13:32:41 timehorse

Go 在万亿级大数据平台开发中的实战

导语迅猛发展的互联网将我们带入了大数据时代,大数据已经成为发展中不可或缺的力量支撑,大数据挑战和机遇并存,如何更好合理、灵活应用大数据是企业的关注所在。七牛大数据团队研发工程师孙健波为大家带来题为Go 在大数据开发中的实战经验的技术分享。以下是此次演讲内容整理。作者介绍:孙健波,InfoQ 专栏作者,硕士毕业于浙江大学计算机学院,2015 年底加入七牛,参与并负责七牛大数据平台整条链路多模块的架构设计以及开发工作,包括大数据计算引擎、时序数据库服务以及日志检索服务。在此之前主要研究和参与 Cloudfoundry、Kubernetes、Docker 等容器与容器云相关工作,是《Docker 容器与容器云》一书的主要作者之一。大数据图 1如图 1 可以看到,现在大数据的生态相对来说比较成熟了,...阅读全文

博文 2017-08-30 05:45:40 孙健波

Golang RPC 之 Thrift

Thrift 简介: Thrift 是一款高性能、开源的 RPC 框架,产自 Facebook 后贡献给了 Apache,Thrift 囊括了整个 RPC 的上下游体系,自带序列化编译工具,因为 Thrift 采用的是二进制序列化,并且与 gRPC 一样使用的都是长连接建立 client 与 server 之间的通讯,相比于比传统的使用XML,JSON,SOAP等短连接的解决方案性能要快得多。本篇只介绍 Golang 关于 Thrift 的基础使用。 安装 安装 Thrift 的 Golang 库有两种方案: 直接通过 go get 命令安装,缺点是因为不可抗拒的网络因素大部分人可能会失败:$ go get git.apache.org/thrift.git/lib/go/thrift 通过...阅读全文

博文 2017-03-17 05:52:34 谢烟客

golang对象序列化和反序列化

模拟测试1,000, 000条数据 每条10个字节 也就是10M不到的 数据(高度结构化的数据) 过程 1.对象序列化为 byte 2.byte反序为对象 3.gzip压缩byte 测试语言go测试方案: raw byte,json ,bson, msgpack (protostuff需要先做对象配置文件,比较麻烦,通常认为和msgpack性能相当 )结果:msgpack 胜出 大小 gzip压缩后大小 对象到byte耗时 byte到对象耗时 raw 10000000 6573252(65%) 未测试 未测试 json 47515988 7919511 (17%) 3248ms 5280ms bson 49888910 9506965 (19%) 3863ms 6235ms msgpack ...阅读全文

博文 2014-10-04 19:27:16 咖啡伴侣

微服务API网关Goku - 基于 Golang 开发的超高性能的企业级微服务API网关

A Powerful HTTP API Gateway in pure golang!Goku API Gateway (中文名:悟空 API 网关)是一个基于 Golang开发的微服务网关,能够实现高性能 HTTP API 转发、多租户管理、API 访问权限控制等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行 API 服务治理、提高 API 服务的稳定性和安全性...阅读全文

Python、Java、Scala、Go Package对照表

格式转换类 分类 Python Java Scala Go Excel xlwt/xlrd, XlsxWriter POI - - PDF PyPDF2 Apache FOP - - CSV csvkit, tablib - - - XML解析 BeautifulSoup/bs4 - - - JSON - jackson json4s, spray-json - 数据处理和计算类 分类 Python Java Scala Go 二维数据分析 pandas - Saddle - 网络分析 networkx JUNG - - 矩阵计算 numpy - Algebird, Breeze blas, gocomplex, go-fn 科学计算 scipy SCaVis - - 符号计算 sympy ...阅读全文

博文 2015-04-10 19:00:00 Worldguy

Go语言如何深度拷贝对象

深度复制可以基于reflect包的反射机制完成, 但是全部重头手写的话会很繁琐. 最简单的方式是基于序列化和反序列化来实现对象的深度复制: func deepCopy(dst, src interface{}) error { var buf bytes.Buffer if err := gob.NewEncoder(&buf).Encode(src); err != nil { return err } return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst) } Gob和bytes.Buffer简单组合就搞定了. 当然, Gob的底层也是基于reflect包完成的...阅读全文

博文 2014-12-26 17:00:18 chai2010

今日头条Go建千亿级微服务的实践

今日头条使用 Go 语言构建了大规模的微服务架构,本文结合 Go 语言特性着重讲解了并发,超时控制,性能等在构建微服务中的实践 编者按:本文来自微信公众号“InfoQ”(ID:infoqchina),作者项超;36氪经授权发布。 今日头条当前后端服务超过80%的流量是跑在 Go 构建的服务上。微服务数量超过100个,高峰 QPS 超过700万,日处理请求量超过3000亿,是业内最大规模的 Go 应用。 Go 构建微服务的历程 在2015年之前,头条的主要编程语言是 Python 以及部分 C++。随着业务和流量的快速增长,服务端的压力越来越大,随之而来问题频出。Python 的解释性语言特性以及其落后的多进程服务模型受到了巨大的挑战。此外,当时的服务端架构是一个典型的单体架构,耦合严重,部分...阅读全文

博文 2017-06-23 10:03:31 强子哥哥

微服务GMS

# GMS 今天是2020年10月24日,一年一度的程序员节,把这个还在开发中的项目开源出来,感兴趣的朋友可以一起参与开发。如果有大神路过请多指教。 GMS是一款基于[gnet](https://github.com/panjf2000/gnet)网络框架开发的Golang RPC微服务框架。 ## 特点: **1:非常简单、学习成本极低。GMS处于初期阶段您想参与开发也非常简单。** ​ 只要您之前使用过类似Gin、beego这样的web框架。就能快速上手,使用方法和这些web框架一样简单。 **2: 不用定义proto等协议文件。** ​ 写proto文件不仅麻烦还容易出错。而且使用协议文件定义服务,最终在框架内部实现都要使用反射去调用目标方...阅读全文

开源项目 2020-10-25 10:42:08

golang json

第一次写 go 代码,研究了一下 json 解析。没想到事情还挺多。 ```go package main import ( "encoding/json" "fmt" "github.com/bitly/go-simplejson" ) type personInfo struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email" xml:"email"` } type personInfo1 struct { Name string `json:"name"` Email string `json:"email" xml:"email"` C string } func main() {...阅读全文

博文 2018-12-28 23:44:23 GuoDapeng

Golang语言Post发送 json形式的请求

项目中需要用到Go语言,所以,快速学习了下,使用net/http库写了一个发送json数据的POST请求。 示例: package main import ( "bytes" "fmt" "io/ioutil" "net/http" ) func main() { url := "http://baidu.com" fmt.Println("URL:>", url) //登陆用户名 usrId := "LaoWong" //登陆密码 pwd := "pwd1234" //json序列化 post := "{ \"UserId\":\"" + usrId + "\",\"Password\":\"" + pwd + "\"}" fmt.Println(url, "post", post) va...阅读全文

博文 2017-03-09 03:00:55 Corwien

go.js简介及实例演示

GoJS是一个JavaScript库,让你轻松创建现代Web浏览器的交互图。 GoJS支持图形化的模板和图形对象属性数据模型的数据绑定。你只需要保存和恢复模型,包括持有任何性质的应用需求,简单的JavaScript对象。许多预定义的工具和命令执行,大部分的图表所需要的标准的行为。外观和行为的定制是大多设置属性的问题。 下载地址:http://gojs.net/latest/doc/download.html 使用gojs开发的流程图及拓扑图实例:http://gojs.net/latest/samples/index.html goJS去水印版:http://download.csdn.net/detail/qq_14966339/9569675 goJS实例演示: function ini...阅读全文

博文 2017-03-10 07:00:49 孟飞阳

golang中map并发读写问题及解决方法

一、map并发读写问题 如果map由多协程同时读和写就会出现 fatal error:concurrent map read and map write的错误 如下代码很容易就出现map并发读写问题 func main(){ c := make(map[string]int) go func() {//开一个协程写map for j := 0; j < 1000000; j++ { c[fmt.Sprintf("%d", j)] = j } }() go func() { //开一个协程读map for j := 0; j < 1000000; j++ { fmt.Println(c[fmt.Sprintf("%d",j)]) } }() time.Sleep(time.Second*20)...阅读全文

博文 2017-03-05 06:02:54 skh2015java

服务监控系统 Prometheus

Prometheus 是一个开源的服务监控系统和时间序列数据库。 ![image](http://static.oschina.net/uploads/space/2015/0205/082749_47Dp_5189.png) 特性: * 高维度数据模型 * 自定义查询语言 * 可视化数据展示 * 高效的存储策略 * 易于运维 * 提供各种客户端开发库 * 警告和报警 * 数据导...阅读全文

go微服务

go-kit 入门 1. microservice Go-Kit go kit 是一个分布式的开发工具集,在大型的组织(业务)中可以用来构建微服务。其解决了分布式系统中的大多数常见问题,因此,使用者可以将精力集中在业务逻辑上。 2. go-kit 组件介绍 2.1 Endpoint(端点) Go kit首先解决了RPC消息模式。其使用了一个抽象的 endpoint 来为每一个RPC建立模型。 endpoint通过被一个server进行实现(implement),或是被一个client调用。这是很多 Go kit组件的基本构建代码块。 2.2 Circuit breaker(回路断路器) Circuitbreaker(回路断路器) 模块提供了很多流行的回路断路lib的端点(endpoint)适...阅读全文

博文 2017-03-28 09:00:32 backtrackx

golang利用gob序列化struct对象保存到本地

golang可以通过json或gob来序列化struct对象,虽然json的序列化更为通用,但利用gob编码可以实现json所不能支持的struct的方法序列化,利用gob包序列化struct保存到本地也十分简单. gob包实现的序列化struct对象保存到本地 务必注意的是golang序列化有个小坑,就是struct里的字段必须要可导出也就是首字母大写 package main import ( "encoding/gob" "fmt" "os" ) type User struct { Id int Name string } func (this *User) Say() string { return this.Name + ` hello world ! ` } func main...阅读全文

博文 2015-04-22 03:00:00 reflectsky

钢铁侠背后的贾维斯,阿里背后的无人零售,见证AI 时代的崛起

还记得贾维斯吗?漫威旗下《钢铁侠》男主角的AI管家。超级英雄托尼·史塔克研发出的一款智能系统,并将它命名为贾维斯,以此来纪念他的老管家埃德温·贾维斯。作为一款智能管家、智能软件,它能够独立思考,会帮助主人处理各种事务,计算各种信息,钢铁侠的机甲开发以及方舟反应炉的更新都离不开它的协助。 当钢铁侠托尼·史塔克穿上盔甲时,它还会自动进行虹膜扫描,以确保机甲非外人入侵。 科幻电影能够呈现人类所能想到的种种愿景,包括人工智能、宇宙探险、基因变异、四维空间等物像。智能管家,则是全民人工智能图景的一个物像折射。虽然存在于电影里,但现在,已经有人研究出智能管家初级版,换句话说,在人工智能这块,人类正在逐步将它具象化(注意,这里的具象化,并非指做成实物,而是以另一种形态出现在实际生活中)。 现实中...阅读全文

gogoprotobuf使用(下)

声明:版权所有,谢绝转载。 承接上文《gogoprotobuf使用(上)》,继续说明gogoprotobuf的各个option。 8 gogoproto.testgen & gogoproto.testgen_all testgen选项为true,则gogo会为相应的message生成一个测试用例与性能测试用例。testgen_all则为相应的package level的option。 pb code: option (gogoproto.testgen_all) = true; option (gogoproto.benchgen_all) = true; message A { string msg = 1; } go code: package test import testing ...阅读全文

博文 2015-03-14 22:00:01 alexstocks

golang rabbitmq实践 (一 rabbitmq配置)

1:环境选择 系统为ubuntu 15.04 ,我装在虚拟机里面的 2:rabbitmq tabbitmq 3.5.4 download url : http://www.rabbitmq.com/ 3:安装 在Ubuntu环境下,建议直接下载deb安装包,可以再ubuntu软件包管理中直接安装,并且安装其他依赖包 4:启动 如果是deb包直接安装的话,默认是直接启动的,也可以通过 sudo rabbitmq-server start 启动。如果提示 node with name "rabbit" already running on "ubuntu" ,则已经启动 5:配置 建议直接启用web管理页面来图形化配置,启用管理界面: rabbitmq-plugins enable rabbit...阅读全文

博文 2015-09-12 03:00:00 shi-meng

golang -- 序列化 msgpack & json

下面总结一下go的序列化,通信中常用的格式:msgpack和json msgpack 安装: go get go get github.com/vmihailenco/msgpack go install github.com/vmihailenco/msgpack api:http://godoc.org/github.com/vmihailenco/msgpack func ExampleEncode() { b, err := msgpack.Marshal(true) fmt.Printf("%v %#v\n", err, b) // Output: []byte{0xc3} } func ExampleDecode() { var out bool err := msg...阅读全文

博文 2014-10-04 19:27:07 flyking

golang-protobuf快速上手指南

什么是protobuf Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准。 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。 如何安装protobuf 在github获取protobuf源码,windows系统可以直接下载exe文件:https://github.com/google/protobuf/releases macos和linux环境使用源码进行安装的步骤 # 获取源码包 wget https://github.com/goog...阅读全文

博文 2018-08-21 01:34:46 豆瓣奶茶

golang 判断是否实现interface接口的方法

由于golang的interface使用很灵活,不需要显示的实现接口interface的方法, 有点动态化的感觉, 缺点:如果没有实现interface的方法,强行转换成interface,运行时候异常报错 解决办法:在编译的时候就把这种错误抛出来,上代码: package main import ( "fmt" ) type value interface { Show() } type test_value struct{} // func (value *test_value) Show() { fmt.Printf("test \n") } var _ value = new(test_value) // 使用类似方法处理,编译的时候会报错 func main() { } // --...阅读全文

博文 2017-01-22 10:00:08 golang_yh

[golang]string及map[string]string类型的封装

在处理url参数时,你是否会因为要经常将字符串类型转换为其他类型,而感觉到代码冗长,麻烦?所以我将自己几个项目都用到的字符串封装提取了出来,提供大家使用。具体实现非常简单,可到liamylian/values查看,下面给出用法: import "github.com/liamylian/values" var v values.Value // 设置默认值,如果为空则使用默认值 v = values.Value("") d := v.Default("happy").String() // 空值判断 v = values.Value("") isEmpty := v.IsEmpty() // 类型转换 v = values.Value("1") s := v.String() b := v....阅读全文

博文 2018-09-26 10:34:52 inspii

Go RPC

什么是RPC? RPC是Remote Procedure Call的缩写,从字面意思理解就是远程过程调用,具体可以见维基百科的解释,如果你英文足够好可以看这里wikipedia,我的理解可以简单的用一句话来描述:RPC就是一个本地程序可以通过网络调用远程的一个子程序。 Go RPC Go的RPC中如果客户端是Go语言编写的则将用Go特有的Gob序列化,同时可以选择rpc/jsonrpc包来用json格式序列化以便和其他的RPC System交互。 Go中的RPC有以下几个限制: 1.Remote Procedure必须是公共的,对于Go的话函数首字母必须大写。 2.Remote Procedure必须又且仅有两个参数,第一个参数是一个指向从客户端接受的数据指针,第二个参数是一个指向返回给客户...阅读全文

博文 2014-11-05 12:00:00 wowzai

Google 新实现的Protobuf RPC: grpc

自: http://www.dongliu.net/post/622450 Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的RPC 实现。 Protobuf 本身虽然提供了RPC 的定义语法,但是一直以来,Google 只开源了Protobuf 序列化反序列化的代码,而没有开源RPC 的实现,于是存在着众多良莠不齐的第三方RPC 实现。 从实现和特性看来,grpc 更多的是考虑移动场景情况下客户端和服务端的通信,正如其自称的「general RPC framework that puts mobile and HTTP/2 first」。HTTP2 本身提供了连接多路复用、Body 和 Header 压缩等机制,grpc 基于此可以提供比较高效的实现。 grp...阅读全文

博文 2015-02-28 03:00:01 huangfox

golang中json的使用

golang中使用json,经常会使用到两个函数 func Unmarshal(data []byte, v interface{}) error 1 将json反序列化成struct对象 2将json 反序列化到map中 3 将json反序列化到slice中 func Marshal(v interface{}) ([]byte, error)1将struct对象序列化成json 2将map序列化成json 3将slice序列化成json package main import ( "fmt" "encoding/json" ) type User struct { Username string Password string FriendName []string } func mai...阅读全文

博文 2017-03-05 05:55:41 skh2015java

golang json库gjson的使用

官方的json库, 只支持整体的序列化与反序列化. 像其它语言的库, json库都支持单个getValue/setValue这类操作. 找了下golang相关的开源json库, GJSON star数不错,支持的查询功能很丰富. 但是没有写入接口. 找了一圈也没有 找到有写入功能的json库. 能想到的只有定义类型序列化或map序列化了. 以下是正文, 翻译自项目readme: 开始 开始使用GJSON之前, 先安装Go, 然后运行go get: $ go get -u github.com/tidwall/gjson 获取值 Get查询指定路径, 通过.来区分. 比如"name.last"或者"age". 如果找到了匹配路径, 将返回结果. package main import "git...阅读全文

博文 2018-07-09 17:34:54 最近不在

Go RPC Inside (client)

Go语言标准库能够自带一个rpc框架还是非常给力的,这可以很大程度的降低写后端网络通信服务的门槛,特别是在大规模的分布式系统中,rpc基本是跨机器通信的标配。rpc能够最大程度屏蔽网络细节,让开发者专注在服务功能的开发上面。下面介绍Go语言rpc框架的客户端内部实现. Go rpc客户端的逻辑很简单,大体上,就是将一个个的调用请求序列化后原子的发送给服务器,然后有一个专门的gorutine等待服务器应答,这个goroutine会将收到的每个应答分发给对应的请求,这就完成了一次rpc调用。 调用入口 func NewClient(conn io.ReadWriteCloser) *Client func (client *Client) Call(serviceMethod string, a...阅读全文

博文 2014-11-08 12:49:15 skoo

测试一下golang的json序列化Marshal

func test_json() { x, _ := json.Marshal([]string{"aaa:123", "bbb:456"}) fmt.Println(x) var caps []string json.Unmarshal(x, &caps) fmt.Println(caps) } //输出结果 ------------------------------- [91 34 97 97 97 58 49 50 51 34 44 34 98 98 98 58 52 53 54 34 93] [aaa:123 bbb:456] //把每个字符都转成对应ascill数值 通过反射找到具体的编码器,此例子对应编码器为string func (e *encodeState) string...阅读全文

博文 2015-09-18 19:00:11 webyh

JSON 序列化和反序列化 In Go

笔者之前有写过关于 xml 的使用文章,今天来给大家介绍关于数据序列化和反序列化的一种常见方式 JSON. 尤其是在 http,rpc 的微服务调用中。 基础语法 在 Go 中我们主要使用官方的 encoding/json 包对 json 数据进行序列化和反序列化,主要使用方法有: 序列化: image 反序列化: image 简单的例子 image 当我们运行代码的时候可以得到如下输出结果: image 在这个列子中,我们使用 unmarshal 和 marshal 将一个整数的 JSON 二进制转化为 go int 数据 注意:在实际应用中,我们在序列化和反序列化的时候,需要检查函数返回的 err,如果 err 不为空,表示数据转化失败。 例如:我们把上面例子中 value 类型由 in...阅读全文

博文 2019-04-13 01:34:40 51reboot

聊聊BoltDB:简单使用

说明 -- BoltDB是一个嵌入式key/value的数据库,即只需要将其链接到你的应用程序代码中即可使用BoltDB提供的API来高效的存取数据。而且BoltDB支持完全可序列化的ACID事务,让应用程序可以更简单的处理复杂操作。 BoltDB设计源于LMDB,具有以下特点: * 直接使用API存取数据,没有查询语句; * 支持完全可序列化的ACID事务,这个特性比LevelDB强; * 数据保存在内存映射的文件里。没有wal、线程压缩和垃圾回收; * 通过COW技术,可实现无锁的读写并发,但是无法实现无锁的写写并发,这就注定了读性能超高,但写性能一般,适合与读多写少的场景。 最后,BoltDB使用Golang开发,而且被应用于influxDB项目作为底层存储。 使用 *安装BoltDB...阅读全文

博文 2017-09-09 14:15:59 丁凯

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

golang的json的时间格式化解决方案 1.通过数据查询的时候指定号格式,这样就不要再转格式了 2.通过time.Time类型穿件别名,然后为这个别名类实现MarshalJSON方法。 以下来自golang的原来注释 If an encountered value implements the Marshaler interface // and is not a nil pointer, Marshal calls its MarshalJSON method // to produce JSON. If no MarshalJSON method is present but the // value implements encoding.TextMarshaler instead...阅读全文

博文 2016-11-08 06:00:05 u013163178

听说,你想让自己的Go程序运行的更快?

到现在为止,我已经忘记了我在写什么,但我确定这篇文章是关于Go语言的。这主要是一篇,关于运行速度,而不是开发速度的文章——这两种速度是有区别的。 我曾经和很多聪明的人一起工作。我们很多人都对性能问题很痴迷,我们之前所做的是尝试逼近能够预期的(性能)的极限。应用引擎有一些非常严格的性能要求,所以我们才会做出改变。自从使用了Go语言之后,我们已经学习到了很多提升性能以及让Go在系统编程中正常运转的方法。 Go的简单和原生并发使其成为一门非常有吸引力的后端开发语言,但更大的问题是它如何应对延迟敏感的应用场景?是否值得牺牲语言的简洁性使其速度更快?让我们来一起看一下Go语言性能优化的几个方面:语言特性、内存管理、并发,并根据这些做出合适的优化决策。所有这里介绍的测试代码都在这里.一、Channels...阅读全文

博文 2016-04-22 16:00:00 abv123456789

Go高性能编程技巧

1.在高并发队列任务分发的场景中Ring Buffer比Channel的性能更好 2.defer功能不是静态编译时提供的,而是运行时提供的,所以使用defer会产生一些额外的性能开销(了解就好,该用还是得用) 3.encoding/json序列化是通过反射机制实现的,性能很差,可以使用ffjson生成encode/decode代码来提升性能。如果可能,使用MsgPack替代JSON,因为MsgPack性能更好。 4.在栈中创建对象比在堆中创建对象性能高,所以少用new来创建对象。需要创建大量临时对象的场景可以使用sync.Pool已减少GC的压力。 5.在性能要求特别高的并发访问同一个对象的场景中,可以通过增加padding的方式避免false sharing,提升CPU cache的命中率...阅读全文

博文 2016-04-21 03:00:06 shijingxiang

golang事件机制

源码地址 https://github.com/slclub/goevents 概述 事件package。 我们可以自由灵活的使用事件,支持串行事件,并行事件; 且可以将串行事件 按定义的模块去触发. 事件函数的自定义参数无限制,但没有返回值。具体执行事件灵活自定义,用On 类函数接口注入到goevents。 可以灵活的绑定事件队列的参数。针对事件去绑定,或者,统一触发事件之前去绑定,或者混合着使用。单个绑定的优先级会更高一些 API English Doc 获取代码到本地 go get github.com/slclub/goevents 使用案例 串行化事件使用案例 ```go import "github.com/slclub/go...阅读全文

gRPC 简介及优缺点

RPC(Remote Procedure Call) RPC(Remote Procedure Call)— 远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 RPC采用客户端/服务器模式。请求程序就是一个客户端,而服务提供程序就是一个服务器。首先,客户端调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客...阅读全文

博文 2019-07-15 13:32:40 wavesnow

go-lexer-词法分析

词法分析一般是编译器的第一部分,而且词法分析很简单,就是一个有限状态机.开始词法分析的过程就是把源文件转换成一组预先定义好的token的过程.这一组被统一表现的token之后会被送入语法分析器进行语法解析,这里我们主要关注如何进行词法分析. 做词法分析就几种方法: 直接使用工具比如lex. 使用更低一层的正则表达式. 使用状态动作,构造一个状态机. 而真正实现一个语言的话,使用工具没有什么错,但是问题是,很难获得正确的错误提示.工具生成的错误处理很弱.而且需要学习另一门规则或特定的语法.生成的代码可能性能不好,难以优化,但是用工具可以非常简单实现词法分析.早期编译器的设计阶段都会使用lex来做词法分析器,比如gcc和Go都是这么做的,但是到了后期一个真正生产化的语言可能不能依赖生成的代码,而...阅读全文

博文 2016-04-12 10:32:31 yueyue.gao

go语言使用protobuf

网上为什么充斥着大量几乎一模一样而且不正确的教程??? 妈的打开一个关于golang和protobuf的教程,无非都是扯他妈的protobuf多么多么牛逼,xml多么多么傻逼,然后就是怎么安装protobuf,然后又是屎一样的示例。 安装过程没一个对的,我搜了那么多博客,全都是一个德行,我先写一下ubuntu的安装步骤,同时适用于mac和其他linux,而且保证是对的。 真的无力吐槽,先说正事,一会接着吐。 一、首先去 https://github.com/google/protobuf 下载protobuf,按照readme的步骤来编译安装。如果执行autogen.sh的过程中出现autoreconf not found的错误,说明没有安装automake,在ubuntu执行sudo ap...阅读全文

博文 2015-07-25 03:00:11 wolfred7464

【玩转Golang】 自定义json序列化对象时,非法字符错误原因

由于前台web页面传来的日期对象是这样的格式“2010-11-03 15:23:22”,所以我安装网上查来的办法,自定义包装了time.Time对象,实现自己的Marshal和UnMarshal方法 type DateTime struct { time.Time } const ctLayout = "2006-01-02 15:04:05" const ctLayout_nosec = "2006-01-02 15:04" const ctLayout_date = "2006-01-02" func (this *DateTime) UnmarshalJSON(b []byte) (err error) { if b[0] == '"' && b[len(b)-1] == '"' { ...阅读全文

博文 2014-12-30 22:00:01 dajianshi

几种Go序列化库的性能比较

序列化库在网络传输,RPC,数据库访问等环境中经常用到,它的性能的好坏直接影响着整个产品的性能。本文列出了几种高性能的Go语言的序列化库,并通过一个简单的无循环引用的数据结构测试它们的性能。测试代码: gosercomp at github 03/14/2016 更新。 增加Thrift/Avro/Gencode的性能比较。 测试的 Serializers 以golang自带的encoding/json和encoding/xml为基准,测试以下性能比较好的几种序列化库。 encoding/json encoding/xml github.com/youtube/vitess/go/bson github.com/tinylib/msgp github.com/golang/protobuf ...阅读全文

博文 2017-02-08 12:53:30 smallnest

Go RPC Benchmark

这篇完成得太折腾了,为了更好的展示benchmark的一系列结果数据,我必须得找个软件将数据进行图表化。以前在windows上基本都用execel画曲线图、柱状图等,但在linux/mac上却找不到顺手的工具了。我也使用过gnuplot,这货不知道是太专业,还是太古老的原因,始终用得不顺手、不开心。于是,我就决定自己先用Go和chart.js库折腾了一个goplot工具来绘制图表,然后再才开始写这篇博客。 有人可能会说我又在折腾轮子了,确实是折腾了一个轮子。话说,这又怎么样呢?作为一个程序员,最大的优势就是自己用得不开心的工具,可以自己动手完善、甚至写一个新的。我认为一个geek程序员首先就是要学会不断的装备自己的工具库。不扯废话了,回归正题。 测试维度 这次benchmark主要以下两个维...阅读全文

博文 2014-11-08 12:49:16 skoo