GoCN每日新闻(2017-05-11)

回复

文章分享astaxie 发起了问题 • 2 人关注 • 0 个回复 • 844 次浏览 • 2017-05-11 08:38 • 来自相关话题

关于统一格式 json 返回 map 的 value 定义

技术讨论PureWhite 回复了问题 • 5 人关注 • 4 个回复 • 867 次浏览 • 2017-05-10 23:40 • 来自相关话题

饿了么正在寻求像你一样厉害的 Gopher

招聘应聘sofish 发表了文章 • 14 个评论 • 2197 次浏览 • 2017-05-10 22:07 • 来自相关话题

Hello Hello,我是饿了么大前端团队的 Sofish,一名 ... 查看全部


Hello Hello,我是饿了么大前端团队的 Sofish,一名 Golang 新手。


我们团队正在寻找优秀的 Gopher 加入。看到「前端团队」大家可能会觉得像 Golang 这样偏后端语言,加入这样的团队肯定没什么前途,也没什么值得干的事,况且是一名新手在招人。不过,大家大可放心,我们是一个还可以的团队,也干了点还可以的活,比如服务于饿了么主 App 的 API Layer、每天有 4 亿量级的小数据监控系统、在大厂中间第一个推出 Server Push 服务并已经服务主站的团队,诸如此类。只是名字叫「前端」,我们的定位在于「把网站、App 运行好」,而不仅仅是做好 UI。所以不止是 Node,关于 Docker、Nginx 之类我们也在做。如果仍不放心,至少业务足够大、薪资也很有竞争力,对吗?


目前我们的 API Layer 是 Node 写的,配合公司 Golang SOA 方面的生态和性能的考虑,后续在计划推动 Go 的版本。另外我们目前提供的 Server Push ( HTTP/2 ) 的服务已经是基于 Go 写的。后续很多系统会主要以 Go 和 Node 来写。所以后面会招聘一批 Gopher,像你一样厉害的 Gopher。


办公地:上海普陀真北路地铁站(近铁城市广场)


要求:



  1. 有 Go 相关的作品,如果是开源 500 stars 以上有加分

  2. 熟悉 HTTP

  3. 熟悉 Linux Server




简历可以发至 sofish@ele.me


BTW. 除了我们,框架团队也在招人,可以找浩川:haochuan.guo@ele.me



GoCN每日新闻(2017-05-10)

回复

每日新闻astaxie 发起了问题 • 2 人关注 • 0 个回复 • 1064 次浏览 • 2017-05-10 09:31 • 来自相关话题

GOLANG将类型作为参数,用反射设置指针的指针,实现类似模板功能

技术讨论winlin 发表了文章 • 0 个评论 • 747 次浏览 • 2017-05-09 20:13 • 来自相关话题

在协议解析中,C++的模板有比较大的作用,有时候我们希望丢弃所有的包,只留下特定类型的包。参考SRS的代码查看全部

在协议解析中,C++的模板有比较大的作用,有时候我们希望丢弃所有的包,只留下特定类型的包。参考SRS的代码SrsRtmpClient::connect_app2


类型系统的设计, SrsConnectAppResPacket继承自SrsPacket


class SrsPacket;
class SrsConnectAppResPacket : public SrsPacket

协议栈提供了expect_message模板函数,接收特定类型的包:


SrsCommonMessage* msg = NULL;
SrsConnectAppResPacket* pkt = NULL;
if ((ret = protocol.expect_message<SrsConnectAppResPacket>(&msg, &pkt)) != ERROR_SUCCESS) {
return ret;
}

SrsAmf0Any* data = pkt->info->get_property("data");
SrsAmf0EcmaArray* arr = data->to_ecma_array();
SrsAmf0Any* prop = arr->ensure_property_string("srs_server_ip");
string srs_server_ip = prop->to_str();

在向服务器发送了ConnectApp后,就等待ConnectAppRes响应包,丢弃所有的其他的。这个时候,类型SrsConnectAppResPacket就作为了一个参数,也就是C++的模板。如果是GOLANG怎么实现呢?没有直接的办法的,因为没有泛型。


在GOLANG中,也需要定义个interface,参考Packet,当然也是有ConnectAppResPacket实现了这个接口(Message是原始消息,它的Payload可以Unmarshal为Packet):


type Message struct { Payload []byte }
type Packet interface {} // Message.Payload = Packet.Marshal()
type ConnectAppResPacket struct { Args amf0.Amf0 }

第一种方法,协议栈只需要收取Message,然后解析Message为Packet,收到packet后使用类型转换,判断不是自己需要的包就丢弃:


func (v *Protocol) ReadMessage() (m *Message, err error)
func (v *Protocol) DecodeMessage(m *Message) (pkt Packet, err error)

不过这两个基础的API,User在使用时,比较麻烦些,每次都得写一个for循环:


var protocol *Protocol

for {
var m *Message
m,_ = protocol.ReadMessage()

var p Packet
p,_ = protocol.DecodeMessage(m)

if res,ok := p.(*ConnectAppResPacket); ok {
if data, ok := res.Args.Get("data").(*amf0.EcmaArray); ok {
if data, ok := data.Get("srs_server_ip").(*amf0.String); ok {
srs_server_ip = string(*data)
}
}
}
}

比较方便的做法,就是用回调函数,协议栈需要提供个ExpectPacket方法:


func (v *Protocol) ExpectPacket(filter func(m *Message, p Packet)(ok bool)) (err error)

这样可以利用回调函数可以访问上面函数的作用域,直接转换类型和设置目标类型的包:


var protocol *Protocol

var res *ConnectAppResPacket
_ = protocol.ExpectPacket(func(m *Message, p Packet) (ok bool){
res,ok = p.(*ConnectAppResPacket)
})

if data, ok := res.Args.Get("data").(*amf0.EcmaArray); ok {
if data, ok := data.Get("srs_server_ip").(*amf0.String); ok {
srs_server_ip = string(*data)
}
}

这样已经比较方便了,不过还是需要每次都给个回调函数。要是能直接这样用就好了:


var protocol *Protocol

var res *ConnectAppResPacket
_ = protocol.ExpectPacket(&res)

if data, ok := res.Args.Get("data").(*amf0.EcmaArray); ok {
if data, ok := data.Get("srs_server_ip").(*amf0.String); ok {
srs_server_ip = string(*data)
}
}

这样也是可以做到的,不过协议栈函数要定义为:


func (v *Protocol) ExpectPacket(ppkt interface{}) (err error)

在函数内部,使用reflect判断类型是否符合要求,设置返回值。代码参考ExpectPacket,下面是一个简要说明:


func (v *Protocol) ExpectPacket(ppkt interface{}) (m *Message, err error) {
// 由于ppkt是**ptr, 所以取类型后取Elem(),就是*ptr,用来判断是否实现了Packet接口。
ppktt := reflect.TypeOf(ppkt).Elem()
// ppktv是发现匹配的包后,设置值的。
ppktv := reflect.ValueOf(ppkt)

// 要求参数必须是实现了Packet,避免传递错误的值进来。
if required := reflect.TypeOf((*Packet)(nil)).Elem(); !ppktt.Implements(required) {
return nil,fmt.Errorf("Type mismatch")
}

for {
m, err = v.ReadMessage()
pkt, err = v.DecodeMessage(m)

// 判断包是否是匹配的那个类型,如果不是就丢弃这个包。
if pktt = reflect.TypeOf(pkt); !pktt.AssignableTo(ppktt) {
continue
}

// 相当于 *ppkt = pkt,类似C++中对指针的指针赋值。
ppktv.Elem().Set(reflect.ValueOf(pkt))
break
}
return
}

遗憾的就是这个参数ppkt类型不能是Packet,因为会有类型不匹配;也不能是*Packet,因为在GOLANG中传递接口的指针也是不可以的,会导致类型错误(**ConnectAppResPacket并不能匹配*Packet);这个参数只能是interface{}。不过用法也很简单,只是需要注意参数的传递。


var res *ConnectAppResPacket
// 这是正确的做法,传递res指针的地址,相当于指针的指针。
_ = protocol.ExpectPacket(&res)
// 这是错误的做法,会在ExpectPacket检查返回错误,没有实现Packet接口
_ = protocol.ExpectPacket(res)

用起来还不错。

【七牛云招聘】Android 多媒体 SDK 开发工程师 /Android OpenGL 开发工程师/iOS SDK 开发工程师 

招聘应聘七小牛来招聘 发表了文章 • 0 个评论 • 601 次浏览 • 2017-05-09 17:12 • 来自相关话题

Android 多媒体 SDK 开发工程师 

岗位职责 

参与 Android 多媒体 SDK 的设计与开发。 

任职要求

  1. 良好的数据结构和算法基础, 良好的工程素养以及关于... 查看全部

Android 多媒体 SDK 开发工程师 


岗位职责 


参与 Android 多媒体 SDK 的设计与开发。 


任职要求



  1. 良好的数据结构和算法基础, 良好的工程素养以及关于 Paper, IETF RFC 与 Open Source 的基本阅读与理解能力; 

  2. 精通 C/C++/Java 编程语言, 熟悉 JNI 机制, 熟悉 NDK 编程, 熟悉汇编; 

  3. 熟悉 Android 多媒体开发, 熟练掌握 Android 基本概念, 并能够灵活利用 Android 提供的机制解决问题; 

  4. 熟练掌握多线程编程, 善于利用各种资源优化代码; 

  5. 熟悉 Android.mk, Makefile 及相关工具链, 以及嵌入式软件架构和调试方法; 

  6. 拥有良好的编码习惯, 热爱多媒体研发工作, 喜欢创新挑战, 自我驱动能力强, 具备良好的沟通能力和团队协作精神。 


加分项



  1. 维护过开源项目; 

  2. 有任意客户端 SDK 开发经验; 

  3. 具备 OMX/MediaCodec 开发经验; 

  4. 具备 Android 网络开发经验; 

  5. 具备大型工程实践或开源软件(例如 FFmpeg )等应用经验; 

  6. 熟悉 RTOS/Linux, 了解线程调度、内存管理、中断处理机制; 

  7. 熟悉 H.264/HEVC, 熟悉 AAC、FLV、TS、MP4 等多媒体容器封装标准; 

  8. 熟悉 FFmpeg, GStreamer, VLC, WebRTC 等多媒体开源项目; 

  9. 熟悉 WebRTC/RTP/RTMP/HLS/DASH 等相关协议规范人才搜索 




Android OpenGL 开发工程师 


岗位职责 


参与 Android 图像处理算法的研究和开发 


任职要求 



  1. 良好的数据结构和算法以及数学基础, 良好的工程素养以及关于 Paper, IETF RFC 与 Open Source 的基本阅读与理解能力 

  2. 精通 C/C++/Java 编程语言, 熟悉 JNI 机制, 熟悉 NDK 编程, 熟悉汇编 

  3. 熟练掌握 OpenGL ES 绘制方法, 深入理解 OpenGL ES 渲染优化策略, 了解 shader 技术 

  4. 精通 OpenGL 开发并熟悉 Android GUI 渲染显示机制, 具备在 Android 系统上做过显示系统移植经验优先 

  5. 熟练掌握多线程编程, 善于利用各种资源优化代码 

  6. 热爱图形图像技术研发工作, 喜欢创新挑战, 自我驱动能力强, 具备良好的沟通能力和团队协作精神 


加分项 



  1. 维护过开源项目 

  2. 熟悉 GPU 开发, CUDA/OpenCL 编程 

  3. 熟悉 OpenCV, OpenGL, NEON 优化等技术 

  4. 熟悉 RTOS/Linux, 了解线程调度、内存管理、中断处理机制 




iOS SDK 开发工程师 


岗位内容: 



  1. 设计实现上传下载 SDK,提升复杂网络环境下的上传下载可用性与速度。 

  2. 设计实现数据收集分析系统,对上传下载中的数据进行实时采集; 

  3. 分析实时采集数据,与 CDN 调度系统协作,实现 100%精准调度; 

  4. 设计实现网络故障检测工具,自动化网络问题的定位,降低问题定位难度; 

  5. 设计实现手机端视频播放器与 SDK,为客户提供全方位的 CDN 加速解决方案。 


岗位要求: 



  1. 3 年以上面向对象程序设计与开发经验,2 年 iOS 开发经验; 

  2. 熟悉 iOS 框架,精通 Java ; 

  3. 熟悉 iOS 应用开发技术,多线程编程,网络编程等; 

  4. 熟悉常用的设计模式、数据结构; 

  5. 熟悉 TCP/IP 协议,HTTP/HTTPS 协议; 

  6. 具有独立思考解决问题的能力,能承担工作压力; 

  7. 热衷技术研究与实践,具备 Hacker 精神; 

  8. 有 iOS SDK 开发经验优先; 





  • 简历投递: xiamengru@qiniu.com (麻烦备注一下职位) 

  • 工作地点:上海市浦东新区亮秀路 112 号 Y1 座 310 室 




公司简介:七牛是国内领先的企业级云存储提供商,由存储技术领军人物许式伟创立。七牛通过自身创新的存储 2.0 以及富媒体云处理技术,专注为“互联网+”企业与创业者提供数据从管理到大数据分析的一站式服务。目前七牛平台已经承载 20 多万家企业,覆盖终端用户数超过全国整体网民的 50%,很多知名创业者以及传统公司转型互联网比如豌豆荚,陌陌,网易,唱吧,蘑菇街,美拍,步步高,oppo, 平安,顺丰等等都在用七牛。许多新兴创业者一旦创业,云存储首选也是七牛,比如足记,知名歌手胡彦斌的牛班等。七牛以帮助企业缩短从想法到产品上线的时间距离为使命,努力让云服务成为打造互联网+的标配支持!官网:www.qiniu.com

Go 做后端服务给 PHP 调用,是提供 HTTP 接口吗?

有问必答tonyjt 回复了问题 • 5 人关注 • 4 个回复 • 1308 次浏览 • 2017-05-09 10:33 • 来自相关话题

【南京】成熟golang团队扩招,公司:孩子王

招聘应聘tonyjt 发表了文章 • 4 个评论 • 727 次浏览 • 2017-05-09 10:26 • 来自相关话题

要求:聪明,好学。

如果你对高并发高负载有兴趣或者有经验,欢迎加微信: tonyjjt

我们底层框架是自己写的开源项目,主要包括redis,db,还有配置等: github.com/tonyjt/tgo ,有兴趣的可以看一看,... 查看全部

要求:聪明,好学。


如果你对高并发高负载有兴趣或者有经验,欢迎加微信: tonyjjt


我们底层框架是自己写的开源项目,主要包括redis,db,还有配置等: github.com/tonyjt/tgo ,有兴趣的可以看一看,欢迎指教。


相关链接 :
https://github.com/tonyjt/tgo 删除


JD:




  1. 1年以上相关工作经验或应届毕业生,熟悉Go的语言特性;




  2. 熟悉算法;




  3. 熟悉mysql / mongo等数据库使用场景




  4. 熟悉各种缓存使用( Redis)




  5. 逻辑清楚,思维清晰,沟通良好,具备良好的分析、理解、解决问题的能力;




  6. 富有团队精神,愿意接受新技术新思维,学习能力良好以上。



  7. 有docker使用经验优先

GoCN每日新闻(2017-05-09)

回复

每日新闻astaxie 发起了问题 • 2 人关注 • 0 个回复 • 1000 次浏览 • 2017-05-09 08:57 • 来自相关话题

如何拆分这类命令行参数?

技术讨论dcb9 回复了问题 • 2 人关注 • 2 个回复 • 756 次浏览 • 2017-05-09 08:20 • 来自相关话题

如果给 web 应用 .exe 添加图标

技术讨论lifei6671 回复了问题 • 3 人关注 • 1 个回复 • 720 次浏览 • 2017-05-08 20:22 • 来自相关话题

如何在程序运行时动态修改它的参数(状态)?

有问必答stirlingx 回复了问题 • 7 人关注 • 5 个回复 • 1608 次浏览 • 2017-05-08 16:19 • 来自相关话题

请问大家用什么来做配置管理

有问必答xkey 回复了问题 • 5 人关注 • 2 个回复 • 884 次浏览 • 2017-05-08 10:19 • 来自相关话题

GoCN每日新闻(2017-05-08)

文章分享shibengen 回复了问题 • 3 人关注 • 2 个回复 • 937 次浏览 • 2017-05-08 10:12 • 来自相关话题

mongo连接池

有问必答pathbox 回复了问题 • 3 人关注 • 2 个回复 • 956 次浏览 • 2017-05-07 21:41 • 来自相关话题