一般来说,我们接收到消息,然后通过消息队列发送消息给worker的时候,会有些额外的字段,这些字段不属于实际的消息,我们想把实际的消息和发给worker的消息分开定义。这时候我们会把worker消息中一个字段定义为interface{}或者object,这个字段表示任意的实际消息。

type WorkerMsg struct {
ID int
Route string
Msg interface{} // 实际消息
}

一切看起来很完美,但是问题来了,当我们用msgpack库decode消息到worker消息结构体的时候,这个Msg字段变成了一堆object的集合体,这时候,我们不得不再写一个函数把这些object,一个一个地复制到实际消息的结构体上,而这个函数是极其复杂的,很容易写错,而且性能也不好。

那么,我们还有更好的办法吗?其实我们可以这样写:

package main

import (
"bytes"
"fmt" "github.com/vmihailenco/msgpack"
) type Abc struct {
BB int
Haha int
} type Msg struct {
ID int
Msg interface{}
} func main() { var msg Msg
msg.Msg = Abc{BB: , Haha: }
var buf bytes.Buffer
msgpack.NewEncoder(&buf).StructAsArray(true).Encode(msg)
data := buf.Bytes() var workerMsg Msg
realMsg := &Abc{}
workerMsg.Msg = realMsg
msgpack.Unmarshal(data, &workerMsg)
fmt.Println(workerMsg, realMsg) }

可看到msgpack将数据解到msgD上,因为用的是指针,同时也解到了realMsg结构上!  这意味着我们不再需要重新定义一个新的结构体,而是组合这些结构体来实现我们的功能。

msgpack库的神奇用法的更多相关文章

  1. #define中 #与##的神奇用法linux学习 (转)

    #define中 #与##的神奇用法linux学习 (转) #define f(a,b) a##b #define d(a) #a #define s(a) d(a) void main( void ...

  2. c/c++ 重载运算符 标准库function的用法

    重载运算符 标准库function的用法 问题:int(int, int)算不算一种比较通用的类型?? 比如函数: int add(int a, int b); 比如lambda:auto mod = ...

  3. Python爬虫入门之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  4. Linux中“!"的神奇用法

    前言 实际上,不起眼的“!”在linux中有着很多让你惊叹的妙用.本文就来细数那些“!”的神奇用法. 执行上一条命令 例如,在执行完上面一条命令后,可以使用下面的方式再次执行上一条命令: $ wher ...

  5. Python爬虫Urllib库的高级用法

    Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...

  6. 【opencv基础】Rect类的神奇用法

    前言 最近看github上源码发现对两个cv::Rect使用相与(&)操作,猛地感觉自己蒙啦,Rect类还有这种神奇用法?!翻看opencv官网Rect类,果然如此! opencv中Rect类 ...

  7. $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法

    本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...

  8. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  9. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

随机推荐

  1. POI颜色设置

    package com.java.connect.poi; import java.io.FileOutputStream; import java.io.IOException; import or ...

  2. 巧用第三方高速开发Android App 热门第三方SDK及框架

    巧用第三方高速开发Android App 热门第三方SDK及框架 历经大半年的时间,最终是把这门课程给录制出来了,也就在今天,正式在慕课网上上线了 项目地址:巧用第三方高速开发Android App ...

  3. 查看主机DNSserver

    一.Nslookup(name server lookup)( 域名查询):是一个用于查询 Internet 域名信息或诊断DNS server问题的工具.nslookup能够指定查询的类型,能够查到 ...

  4. java.sql.SQLException: Can not issue data manipulation statements with executeQuery().

    1.错误描写叙述 java.sql.SQLException: Can not issue data manipulation statements with executeQuery(). at c ...

  5. Android中build target,minSdkVersion,targetSdkVersion,maxSdkVersion概念区分

    问题引入:   有一个下载功能,在Android 5.x设备上运行正常,Android 6.x上运行异常,现象是下载进度卡在0%.   问题排查发现,是sdk的target设置为23导致,修改为21则 ...

  6. 《RabbitMQ Tutorial》译文 第 6 章 远程过程调用(RPC)

    原文来自 RabbitMQ 英文官网的教程(6.Remote procedure call - RPC),其示例代码采用了 .NET C# 语言. In the second tutorial we ...

  7. 初装Ubuntu一般配置

    1. 开启ssh远程 2.修改root密码 sudo passwd 输入两次密码. 3.授权普通用户root权限 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示: ...

  8. mysql新建数据库,并设置charset为utf8,使用utf8_general_ci字符集校验结果

    一. 实现功能 有时候在linux服务器端, 会在mysql命令行中, 创建数据库, 今天讲一下怎么在创建数据库时, 把charset设置为utf8,collate设置为utf8_general_ci ...

  9. springboot命令启动

    gradle打jar包命令 jar { doFirst { def jarFiles = ''; configurations.compile.collect { jarFiles += it.nam ...

  10. mybatis框架(5)---动态sql

    那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态S ...