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

JSON与Go

介绍 JSON(JavaScript Object Notation)是一种简单的数据交换格式。从语法上来说,它综合了JavaScript的对象(objects)和列表(lists)。通常用于在web后端和运行在浏览器中的JavaScript程序之间通信,不过也可以用在很多其他的地方。官方主页,json.org,提供了对标准的详尽说明。 使用json 包可以轻松地在Go程序中读写JSON数据 编码 通过函数Marshal编码JSON数据。 func Marshal(v interface{}) ([]byte, error) 给定Go的数据结构, Message, type Message struct { Name string Body string Time int64 } 以及Mes...阅读全文

博文 2014-11-21 22:00:00 zhjih123

【玩转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

golang 单向 channel

只写通道:chan<- T只读通道:<-chan T 即只可写入或只可读的channel,事实上 channel 只读或只写都没有意义,所谓的单向 channel 其实知识声明时用,比如func foo(ch chan<- int) <-chan int {...} chan<- int表示一个只可写入的 channel,<-chan int表示一个只可读取的 channel。上面这个函数约定了 foo 内只能从向 ch 中写入数据,返回只一个只能读取的 channel,虽然使用普通的 channel 也没有问题,但这样在方法声明时约定可以防止 channel 被滥用,这种预防机制发生再编译期间。如果后续代码里,向本来用于读channel里写入了数据,编译器会提示错误,这时就要仔细检查自己的...阅读全文

博文 2018-08-31 15:37:29 夜空一起砍猩猩

go1.11的module机制和dep/govendor机制问题

module机制和dep/govendor机制是否冲突? 自从go团队推出module机制后,go团队和dep社区发生了一些冲突,有一篇有名的争论《关于Go Module的争吵》,读后给人一种错觉,似乎module机制和dep/govendor机制是不相容的。但是仔细分析二者的运行机制,其实两者并无冲突,反而是互补性质的。 module机制由环境变量GO111MODULE控制,它有三个值:off、on、auto,默认值是auto。在auto模式下,在$GOPATH/src路径下build时,默认使用vendor、GOPATH导入第三方包,而在GOPATH之外编译时,默认使用go.mod设置导入项目。我们知道vendor机制只有在GOPATH路径之下才起作用,到了GOPATH之外就没用了。所以...阅读全文

博文 2018-08-26 11:34:54 从火星来

Go数据结构之栈

一、什么是栈​这是杭州地铁1号线线路图。大卫哥考考大家,地铁列车如何调头?我也不卖关子了,列车通常是用“人字轨道”来变换车道。​列车先从A轨道开进“人字轨道”里,再从B轨道开出。从A轨道开进去的时候1号车厢是车头,从B开出来的时候4号车厢就变成车头了。所以大家看到地铁前后各一个车头。“人字轨道”有个特点:先进后出,英文简写就是FILO,含义自己体会。计算机专家把“人字轨道”抽象出来,提出了一个叫“栈”的概念。​栈和“人字轨道”的特点是一样的FIFO,只不过把车厢换成了数据。接下来,看大卫哥把栈扒的底裤不剩。二、栈的结构​大卫哥把栈拆分成容器和链表两块,容器用结构体实现,链表用单链表,当然大家也可以用其他链表结构,甚至数组来实现。三、接口说明及实现​1、Init初始化栈,其实就是初始化里面的链...阅读全文

博文 2017-11-16 02:29:29 rhan-zz

观察者模式 Go语言实现

模式组成: 观察者模式包含如下角色: 目标(Subject): 目标知道它的观察者。可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。 具体目标(ConcreteSubject): 将有关状态存入各ConcreteObserver对象。 观察者(Observer): 为那些在目标发生改变时需获得通知的对象定义一个更新接口。当它的状态发生改变时, 向它的各个观察者发出通知。 具体观察者(ConcreteObserver): 维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现O b s e r v e r的更新接口以使自身状态与目标的状态保持一致。 效果: Observer模式允许你独立的改变目标和观察者。你可以单独复用目...阅读全文

博文 2016-04-18 12:00:06 readen

用Go语言做产品半年的一些感觉

用Go语言做产品刚好半年,有一些感觉跟大家说道说道。 在使用Go之前,我常常想象,无法使用先进的Debug工具会对工作进度造成多么巨大的影响。甚至在Visual Studio的娇惯下认为,不能调试基本就无法正确的写出代码了。 由于我在Windows平台,能够支持Go语言调试的gdb老是无法工作,所以在这半年中,我一次都没有打过断点,也没有开启过一次单步跟踪。刚开 始我心里非常没底,只好老老实实为每一个方法写测试代码,每开发完一个功能之后就运行所有测试。这个方法其实也算是家喻户晓的了,但很奇怪,我在写C#的 时候并不会自觉地这样做。只有在一些非常特殊的部分会写部分测试代码。 事后我想了想,懒惰只是其中一个原因,还有一个原因是“编译速度”。众所周知,Go语言的编译速度是非常快的。平时看到这个消息...阅读全文

博文 2015-06-11 03:00:06 ShaYeBlog

用GO实现的改进的观察者模式

废话不说。上代码: Publisher.go: package main import ( "container/list" ) type Handler interface {//这里主要参考了Go里HTTP包的实现 Serve(int) } type HandlerFunc func(args int) func (f HandlerFunc) Serve(args int) {//是不是很熟悉的代码? f(args) } type Publish struct { HandlerFuncs *list.List Value int } func NewPublisher() *Publish { p := new(Publish) p.HandlerFuncs = list.New()...阅读全文

博文 2015-06-18 09:02:16 zha_stef

HTTP(S) 路由器fabio

fabio 是一个快速、现代、zero-conf 负载均衡 HTTP(S) 路由器,用于部署 consul 管理的微服务。 fabio 由 eBay Classifieds Group 开发, 用于处理 marktplaats.nl 和 kijiji.it 的流量。Marktplaats 所有的流量都经过 fabio ,每秒有数千个请求,分发于数个 fabio 实例。但我们并没有观察到任何延迟。 特性: * Go 语言单一二进制,没有额外的依赖。 * Zero-conf * 通过后台观察器热重载路由表 * 轮转和随机分布 * Traffic Shaping (send 5% of traffic to new instances) Graphite metrics * 请求跟踪 * W...阅读全文

在个人博客实现「小课」系统

程序员这个行业,是一个终身学习的行业,经常会有新技术出现。我是一个很爱学习的人,喜欢尝鲜。每次想去学习一项新技术的时候,总是苦于找不到合适的入门教程。于是有了想自己写个小课系统的想法:希望能通过写一系列的文章,组织成一门小课,帮助想学习某项技术的同学快速入门。 有了这个想法之后,我开始准备搭建小课平台,一开始想的是做一个前后端分离的网站,后端用 Go 写 API,前端用 vue 写页面。 使用 vue + ElementUI 搭建出来的第一个版本长这样: 写完第一个版本之后,仔细想了一下,如果要写好这个小课系统的话,我还得做好几件事: 写 API ,前后端进行数据交互 写 Markdown 编辑器,在线录入课程 做服务端渲染,做 SEO 优化 一想到这里,头开始有点大,第一个对外发布的小课系...阅读全文

博文 2020-04-16 10:36:55 艾逗笔

关于golang中use as value错误

今天写代码过程中突然报错了,百思不得其解,错误如下 报错代码 第一次遇到这个错误,于是上网搜了一下也没有找到解决。仔细阅读代码后发现initEs(str)这个方法没有设置返回值,而我在使用initES(str)时写了返回值。initEs(str)方法如下: initEST(str) 总结:每一个操蛋的错误,都有一个极其sb的失误造成的...阅读全文

博文 2019-03-17 18:34:42 贝塔船长

golang struct 的奇技淫巧

在使用golang变成的过程中,struct的使用频率非常高,基础的使用我们都会,但有的时候可能会接到一些特殊的需求,或者发现别人的代码读起来不那么顺畅。那是因为struct的一些“冷门”方式,我们不那么熟练。 接下来,就跟大家分享下,我最近用到的“生僻方法”: 结构体中的json是干什么用的? 定义一个结构体 type Tina struct{ appID string`json:"string"` } 这里的这个json可不是备注的意思,而是在使用http接口进行传输时,根据json标识的内容对结构体做解析。 在做项目的时候就发生一个case: { actionIDint`json:"actionType"` actionTypestring`json:"actionID"` } 报错:...阅读全文

博文 2019-10-18 00:32:52 aside section ._1OhGeD

go语言很给力呀

最近因为项目需要,所以写了一个id生成器,于是当时想为了省事就用go语言来写得了,于是花了大概半天的时间写了300多行码,完成之后开始测性能。一开始是在自己的虚拟机上测的,客户端是用php的,结果发现php在单进程环境下只能跑30个请求,这个结果其实也不意外,因为这根本就不是服务器的问题,而是php本身的性能不行,所以压力压不上去。于是用pcntl_fork出多个进程来,每个进程跑一些请求,最后在主进程里计算总的时间,结果发现1s最多处理1000-2000之间,并且随着并发数增多,性能下降很快。这个结果让人比较意外,原以为go语言的性能会好很多。 后来仔细想了想,突然想起来有个参数可以设置runtime.MAXPROC,用于设置可以使用的cpu数目。于是在设置了这个参数之后又开始测试,一开始...阅读全文

博文 2014-10-04 19:26:39 javatgo

01背包问题(完全背包,部分背包)golang实现

很经典的动态规划问题,具体思路这里就不列出了,网上太多资料了。想要详细理解的话可以去看背包九讲 这里分别列出,01背包,完全背包,部分背包 golang实现。 01背包 给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。 应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大? 从左往右,从上往下填表(example: 5表示重量,12表示价值) 1.png 代码and注释 dp[i][j] = max(dp[i-1][j], nums[i][1]+dp[i-1][j-nums[i][0]]) 仔细想清楚这一行 backpack.png 完全背包 给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi,每个物品都有无限多件...阅读全文

博文 2017-10-24 02:04:49 Tibbersshao

golang的sql.DB的一些注意事项及读写锁的总结

最近在写一个用于存储protobuf配置的配置管理服务,业务逻辑不难,2天就搞定,但是后续bug不少,也踩了很多坑,在这里记录下。 首先,一直以为golang内的sql模块是单链接的,所以一开始在每个goroutine内都open了一个DB,并写了一个连接池进行管理。后续发现是多此一举,白白写了好多代码。golang的sql模块自带连接池功能,在执行sql语句的时候才会分配连接,执行完毕后归还给连接池,所以假设用golang的sql模块,一个程序一个DB就行了。 既然有连接池的支持,那么也要注意千万不要泄露连接池的连接。假设你采用Query来执行查询语句,那么会返回一个sql.Rows结构,这个结构会占用一个连接,只有在遍历完才会自动关闭,所以最好是获得了Rows后执行一次Rows的Clos...阅读全文

go1.11的module机制和dep/govendor机制问题

##module机制和dep/govendor机制是否冲突? 自从go团队推出`module`机制后,go团队和dep社区发生了一些冲突,有一篇有名的争论《关于Go Module的争吵》, 读后给人一种错觉,似乎`module`机制和`dep/govendor`机制是不相容的。但是仔细分析二者的运行机制, 其实两者并无冲突,反而是互补性质的。 `module`机制由环境变量`GO111MODULE`控制,它有三个值:`off、on、auto`,默认值是`auto`。 在`auto`模式下,在`$GOPATH/src`路径下`build`时,默认使用`vendor`、`GOPATH`导入第三方包, 而在`GOPATH`之外编译时,默认使用`go.mod`设置导入项目。我们知道`vendor`机...阅读全文

博文 2018-08-26 21:58:42 fuhuizn

Go数据结构之栈

一、什么是栈 这是杭州地铁1号线线路图。大卫哥考考大家,地铁列车如何调头? 我也不卖关子了,列车通常是用“人字轨道”来变换车道。 列车先从A轨道开进“人字轨道”里,再从B轨道开出。从A轨道开进去的时候1号车厢是车头,从B开出来的时候4号车厢就变成车头了。所以大家看到地铁前后各一个车头。“人字轨道”有个特点:先进后出,英文简写就是FILO,含义自己体会。计算机专家把“人字轨道”抽象出来,提出了一个叫“栈”的概念。 栈和“人字轨道”的特点是一样的FIFO,只不过把车厢换成了数据。接下来,看大卫哥把栈扒的底裤不剩。 二、栈的结构 大卫哥把栈拆分成容器和链表两块,容器用结构体实现,链表用单链表,当然大家也可以用其他链表结构,甚至数组来实现。 三、接口说明及实现 1、Init 初始化栈,其实就是初始化...阅读全文

博文 2017-11-16 03:05:04 懒人记

Go语言学习笔记2——数组和Slice

在任何一门语言里,数组应该都是非常基础的类型了,使用率当然也应该是很高的。go不但提供了数组,而且还在数组这个类型之上加了一层包装,这个包装也就是slice。 go的数组变量(也就是数组名)是真真实实的数组,而不是一个指向数组内存起始位置的指针,也不能和同类型的指针进行转化,这一点严重不同于C语言; C语言主要还是类型系统太弱了,因此很多的数据最终都退化为指针的方式来访问。 go的数组定义: var a [10]int var a = [10]int{0,1,2,3,4,5,6,7,8,9} var a = [...]int{0,1,2,3,4,5,6,7,8,9} var a = [2][2]int{[2]int{1,1}, [2]int{2,2}} var a = [2][2]int{{...阅读全文

博文 2014-10-09 16:00:05 Marcky

GitHub Now in Kubernetes!

如果你现在正在使用GitHub,那么,有没感觉到和前两天有什么不同呢?就在昨天,Github已经悄悄的完成了(可能是局部)用户流量到生产环境Kubernetes集群的切换。对,如果你运气足够好的话,也许就是其中一个。 这可不是简单的『又一个Kubernetes in Production』案例。作为全球最大的代码托管和编程社交网络,估值超过20亿美元的GitHub网站坐拥数千万用户和亿级的代码仓库,已然成为全球软件开发者每天赖以生存的光和土壤。GitHub将如此规模业务押注在Kubernetes上,无疑是对Kubernetes生态极大的鼓舞。 在GitHub工作的SRE Aaron昨天在Twitter上给好友,现任Google公司首席布道师的Kelsey发了一条推文透露了这个消息,作为Kub...阅读全文

database/sql包连接池解读

连接池是做网络应用经常用到的一个概念,可以缓存连接减少创建连接的损耗。那么在golang中应该如何做一个连接池,在这里会通过解读database/sql包的连接池实现来给自己一些参考和启发。首先,需要了解database/sql的基本原理和使用方法,请参考下面的链接仔细阅读:http://go-database-sql.org/overview.htm...阅读全文

Golang 生成Excel文件(.xlsx)

1、导入xlsx直接生成Excel: go get github.com/tealeg/xlsx 如果在get包时长时间没有反应,那可以直接从我的百度云下载 xlsx 包,之后直接放在你项目的 github.com 文件夹下就可以了 https://pan.baidu.com/s/1T-RsQ6lyP2bw330tD1svgQ package main import "github.com/tealeg/xlsx" func main() { file := xlsx.NewFile() sheet,err := file.AddSheet("sheet1") if err != nil { panic(err) } row := sheet.AddRow() row.SetHeightCM...阅读全文

博文 2019-08-09 20:33:00 LLL_小浪

go语言很给力呀

最近因为项目需要,所以写了一个id生成器,于是当时想为了省事就用go语言来写得了,于是花了大概半天的时间写了300多行码,完成之后开始测性能。一开始是在自己的虚拟机上测的,客户端是用php的,结果发现php在单进程环境下只能跑30个请求,这个结果其实也不意外,因为这根本就不是服务器的问题,而是php本身的性能不行,所以压力压不上去。于是用pcntl_fork出多个进程来,每个进程跑一些请求,最后在主进程里计算总的时间,结果发现1s最多处理1000-2000之间,并且随着并发数增多,性能下降很快。这个结果让人比较意外,原以为go语言的性能会好很多。 后来仔细想了想,突然想起来有个参数可以设置runtime.MAXPROC,用于设置可以使用的cpu数目。于是在设置了这个参数之后又开始测试,一开始...阅读全文

博文 2015-06-17 23:01:27 HopingWhite

golang的sql.DB的一些注意事项及读写锁的总结

最近在写一个用于存储protobuf配置的配置管理服务,业务逻辑不难,2天就搞定,但是后续bug不少,也踩了很多坑,在这里记录下。 首先,一直以为golang内的sql模块是单链接的,所以一开始在每个goroutine内都open了一个DB,并写了一个连接池进行管理。后续发现是多此一举,白白写了好多代码。golang的sql模块自带连接池功能,在执行sql语句的时候才会分配连接,执行完毕后归还给连接池,所以假设用golang的sql模块,一个程序一个DB就行了。 既然有连接池的支持,那么也要注意千万不要泄露连接池的连接。假设你采用Query来执行查询语句,那么会返回一个sql.Rows结构,这个结构会占用一个连接,只有在遍历完才会自动关闭,所以最好是获得了Rows后执行一次Rows的Clos...阅读全文

源码分析context的超时及关闭实现

前言: Golang的context的作用就不多说了,就是用来管理调用上下文的,控制一个请求的生命周期。golang的context库里有四个组件。 withCancel用来控制取消事件,withDeadline和withTimeout是控制超时,withValue可以传递一些key value。 // xiaorui.cc func WithCancel(parent Context) (ctx Context, cancel CancelFunc) func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) func WithTimeout(parent Context, timeout time...阅读全文

博文 2019-06-11 20:39:57 rfyiamcool

Just for fun——go实现一下观察者模式

代码 package main import ( "fmt" ) type Subject interface { RegisterObserver(o Observer) RemoveObserver(o Observer) NotifyAllObservers() } type Observer interface { // 温度,湿度,气压 Update(temp float32, humidity float32, pressure float32) } type WeatherData struct { Temperature float32 Humidity float32 Pressure float32 Observers map[Observer]bool } func N...阅读全文

博文 2017-11-12 11:04:40 火蜥蜴

气象台如何通知展示台——观察者模式

观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 当新类型的观察者出现时,主题的代码不需要改变,我们需要做的是在新的类里实现观察者的接口,然后注册给主题即可。主题不在乎别的,它只会发送通知给所有实现了观察者接口的对象。 改变主题或观察者其中一方,并不会影响另一方,因为两者是松耦合的,只要它们之间的接口仍被遵守,我们就可以自由地改变它们。 接口设计 主题: 我们的主题应该至少拥有以下三个方法: type subject interface { registerObserver(string, observer) removeObserver(string) notifyOb...阅读全文

博文 2020-04-05 19:32:39 byte

从那些我5年前就想做的事谈起

说来,估计每个人都有一堆想做却没做的事,甚至不仔细想都不记得自己当初立过哪些flag。 因为太多的flag最终都是不了了之,人本能的逃避,也不愿再提起了。 我突然再提起这个话题,到不是我立个flag改过自新了,只是最近翻读了下笑来老师的《自觉是门手艺》,对书中一段话颇有感触。 哪些是你5年前就想做但现在依然没开始做的事? 以5年为界,回想起来,我想要做却一直没做的事着实不少,如果只看编程这方面: 远的有 学python 专研算法/加强下数学 近的有 学linux 学vuejs 不一一列举,但自己这5年来也不是什么没学,5年前自己应该是只会C#,但后来陆续学会了js和golang,并有了相关的工作经验。 在编程这方面,我是更偏向于在工作中学习,单纯的为了学习而学或者研究,似乎真没有那么多耐心。...阅读全文

博文 2019-04-04 01:34:39 海之方

Go 笔记之详解 Go 的编译执行流程

上篇文章介绍了Golang在不同系统下的安装,并完成了经典的Hello World案例。在这个过程中,我们用到了go run命令,它完成源码从编译到执行的整个过程。 今天来详细介绍下这个过程。简单理解,go run 可等价于 go build + 执行。 build命令简述 在Golang中,build过程主要由go build执行。它完成了源码的编译与可执行文件的生成。 go build接收参数为.go文件或目录,默认情况下编译当前目录下所有.go文件。在main包下执行会生成相应的可执行文件,在非main包下,它会做一些检查,生成的库文件放在缓存目录下,在工作目录下并无新文件生成。 新建hello案例 在正式介绍编译流程前,再重新演示下Hello World案例,新建hello.go文件...阅读全文

Linux下使用-static -lpthread静态编译出现段错误(Segmentation fault)

发自:https://blog.csdn.net/godmaycry/article/details/78718399最近在看golang,感觉go的静态编译思想很不错。于是准备把手头的几个项目静态编译一下,结果编译的时候没报任何警告及错误,一运行就报段错误(Segmentation fault)。gdb逐步调试,发现问题出在std::thread那里。仔细检查了下所有语法,没发现任何问题。关键是动态编译一切正常,加了-static静态编译就会出现这个问题。Google才发现这是一个bug,std::thread Segmentation fault static linking解决方案有两个:1.参数加上-Wl,--whole-archive -lpthread -Wl,--no-whol...阅读全文

博文 2020-05-29 11:34:13 liugensite