![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
golang
吴冬冬
此处省略300字
展开
-
golang进阶(一)——glide的使用手册
+++ title=”golang——glide的使用手册” date=”2017-10-10” tags=[“golang”,”glide”,”docker”] categories=[“资源管理”] description=”golang也有包管理,类似maven,gradle,npm,bower之类的” featured=true image=”img/201710/fengji原创 2017-10-09 19:12:57 · 3776 阅读 · 0 评论 -
golang使用rabbitmq(五)Topic模式
简介上一篇用可选择接受的direct交换器代替了广播接受到fanout交换器,但是direct模式还是有局限性,它不能通过多个条件路由。比如linux的日志系统,它不仅分级别(info/warn/crit…),而且还分来源设备(auth/cron/kern…)。我们需要一个非常复杂度组合,比如想接受来自cron的critical日志和来自kern的所有日志。当然topic交换器可以实现这一...原创 2019-08-14 10:10:38 · 2189 阅读 · 1 评论 -
golang使用rabbitmq(四)路由功能
路由上一章我们讲的是一个简单的日志系统,把日志广播到每一个接受者。在这一章增加一点功能,为了节省磁盘,只有告警日志和错误日志才进行存储,其他日志就打印到控制台就可以了。绑定上一章我们也讲过绑定,绑定是让队列和交换器之间的关系。通俗点说就是让队列只对它所绑定的交换器中的信息感兴趣。for _, key := range os.Args[1:] { log.Printf("Binding ...原创 2019-06-18 14:49:05 · 1529 阅读 · 0 评论 -
golang使用rabbitmq(三)发布/订阅
上一篇文章中讲了工作队列,但是工作队列只能做到一个生产者的消息被消费者消费一次。现在要实现一个生产者的消息被两个不同的消费者同时消费,我们把这种模式叫做发布订阅。交换器RabbitMQ消息传递模型的核心是生产者永远不会把消息直接发送到某个队列上,甚至根本不知道消息是否发送到队列上。生产者只向交换器发送消息。交换器来决定怎么处理消息,是把消息传递到特定的队列,还是把消息传到多个队列,或者直接丢...原创 2019-06-17 10:38:32 · 3246 阅读 · 1 评论 -
golang使用rabbitmq(二)工作队列
在helloworld那一章讲了一个简单的一个生产者一个消费者的模型,但生产系统中很多时候是多个生产者或者多个消费者同时处理的。生产者 body := bodyFrom(os.Args) err = ch.Publish("", q.Name, false, false, amqp.Publishing{ DeliveryMode: amqp.Persistent, ContentT...原创 2019-06-10 10:52:12 · 2543 阅读 · 0 评论 -
golang使用rabbitmq(一)helloworld
modulerequire github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94连接rabbitmq conn, err := amqp.Dial("amqp://admin:rabbitmq123@18.232.146.30:5672/") defer conn.Close()打开通道 ch, err := co...原创 2019-06-06 09:33:38 · 3629 阅读 · 1 评论 -
rust和go该如何选择
为了内存安全引入所有权概念,为了圆所有权这个坑,引入生命周期,各种BOX。艰难的圆着所有权的坑,因此在rust群里经常谈论的大部分是语法问题,这是其他所有语言都不常见的。虽然一次编译完就可以安心的跑下去,但是编译的过程何其糟心,心智负担和掉发率都居高不下。更有点奇怪的是很多人把这种奇技淫巧当作是高端技术,茴香豆的十八种写法。对比之下更喜欢大道至简的go,再复杂度应用场景简单组合一下就可以实...原创 2019-05-16 15:15:49 · 17249 阅读 · 2 评论 -
golang通过redis调用rust
golang的redis端要注意的是要先订阅回复,然后再发送请求。package mainimport ( "github.com/go-redis/redis")var wait = make(chan interface{})func main() { client := redis.NewClient(&redis.Options{ Addr: "w...原创 2019-04-18 12:04:13 · 884 阅读 · 0 评论 -
java实现golang类似的chan
java版本的CSP操作public class Chan<T> { private T message; private boolean empty = true; public synchronized T take() { while (empty) { try { wait()...原创 2018-11-12 14:52:26 · 2329 阅读 · 1 评论 -
golang进阶(八)——隐藏技能go:linkname
什么是go:linkname指令的格式如下://go:linkname hello github.com/lastsweetop/testlinkname/hello.hellofuncgo:linkname引导编译器将当前(私有)方法或者变量在编译时链接到指定的位置的方法或者变量,第一个参数表示当前方法或变量,第二个参数表示目标方法或变量,因为这关指令会破坏系统和包的模块化,因此在使用时必须导入u原创 2017-12-18 10:51:29 · 12214 阅读 · 1 评论 -
golang进阶(六)——restful开发优雅处理error
前言golang的error处理一直被人诟病,其实通过设计模式可以很好的处理error,这里就以restful开发为例讲下error优雅的处理resuful开发中,error处理有两个目的,一可以将错误信息返回给用户,二要方便调试,为了达到优雅还要一点,不要到处都是各种if语言当然作为优雅的代码还有一点要保证,就是尽量不写重复的代码panic处理在这里我们把panic处理一下,把panic的if判断原创 2017-11-02 08:27:19 · 3856 阅读 · 2 评论 -
golang进阶(五)——restful开发的json处理
前言restful开发时,对象转json,json转对象是非常频繁的操作,怎么样才能少些重复的代码呢,以这个为目的开启这篇文章所有代码放在github上简化数据结构每次需要返回的数据有code,msg,data这些字段,每个类型都加这些字段太繁复了,这里有interface的方式,去代替任意类型,然后使用的时候data字段与其他类型任意的组合package modeltype Resp struct原创 2017-10-31 16:47:47 · 3159 阅读 · 0 评论 -
golang进阶(七)——go语言的几种测试方法
前言用了go的测试框架,再想下junit的,虽然已经Junit5,那丑陋程度还是依然。java出来的时候,还没有很多软件工程的概念,语言先出来了,因此需要通过不同的插件慢慢补。go就很幸运,出来的时候很多软件工程的概念已经基本定了下来,可以加到语言特性之中,go的测试就简便很多,不愧是为工程而生的语言需要测试的程序我们需要测试的程序文件叫做utils.go,里面有个字符串反转的方法Reverse,代原创 2017-11-07 16:41:40 · 3605 阅读 · 1 评论 -
golang进阶(三)——后台进程的启动和停止
+++ title=”golang进阶(三)——后台进程的启动和停止” date=”2017-10-12” tags=[“golang”,”cobra”] categories=[“资源管理”] description=”不想再像java或者其他语言那样为了操作后台程序写各种脚本的话,这篇文章值得你一看” featured=true image=”img/201710/fengjing原创 2017-10-12 10:23:20 · 10584 阅读 · 0 评论 -
golang进阶(二)——cobra更实用的命令行
+++ title=”golang——cobra更实用的命令行” date=”2017-10-11” tags=[“golang”,”glide”,”docker”] categories=[“资源管理”] description=”golang自身带的命令行包,各种case,有代码洁癖的人看着就令人头大” +++cobra是个非常不错的命令行包,docker,hugo都在使用基命令首先原创 2017-10-11 10:59:23 · 6749 阅读 · 0 评论 -
golang使用rabbitmq(六)RPC
之前的章节都是在说一方发指令,另一方执行这种情况,指令发送者不关系指令的完成情况,或者不需要阻塞去获得结果,结果异步通知。但很多时候是需要阻塞得去获得执行结果的,比如http的请求。在rabbitmq使用RPC的关键就是ReplyTo属性err = ch.ExchangeDeclare("rpc_topic", amqp.ExchangeTopic, true, false, false, ...原创 2019-09-05 16:36:17 · 1225 阅读 · 0 评论