代码 > 记录:通过golang的reflect包创建value的指针
2018-01-03
这个问题困扰了我一定时间,搜了一圈后发先自己2了
先用New创建空指针
然后给指针的Elem设置为具体的值。
主要一直以为New出来的对象没发用,是个zero value,到处panic,没反映过来elem还是可以用来set的。
其实想想也是,如果没法赋值的话,这个New函数有什么用……
大概代码:
var v = mapvalue.MapIndex(reflect.ValueOf(key))
var vp = reflect.New(v.Type())
vp.Elem().Set(v)
代码 > 用nssm为windows添加服务
2017-09-29
最近牵涉到需要在为客户做一个提供api转发的守护程序,研究了下什么方法最方便,立刻看中了nssm
nssm有命令行以及图形界面,通过简单的bat程序就能非常容易的做一个注册服务的安装程序。
具体网址:
https://nssm.cc/
代码 > golang中生成prefix形式的xmlns的xml文件
2017-09-17
最近在做一个调用soap接口守护程序。
找了一圈golang的库,都不是太好用,就干脆用仿照soap代码,自己生成和解析xml代码了。
然后发现golang 至少 1.9的xml库,虽然可以解析prefix,但不能生成prefix。查了一圈只能用模拟的方式自行去实现。
也就是自己去生成xmlns的属性,自己填入。
具体来说,代码结构如下:
type GetPartsInfoListRequest struct {
SoapNS string `xml:"xmlns:soap,attr"`
TemNS string `xml:"xmlns:tem,attr"`
XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ soap:Envelope"`
}
req := GetPartsInfoListRequest{}
req.SoapNS = "http://schemas.xmlsoap.org/soap/envelope"
req.TemNS = "http://tempuri.org/"
bytes, err := xml.Marshal(req)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
另有之前遇到的错误
The SOAP action specified on the message, '', does not match the HTTP SOAP Action, 'http://tempuri.org/xxxx'.
这是构建请求xml时没有加入ws-a信息
参考 https://social.msdn.microsoft.com/Forums/vstudio/en-US/ed32328d-e3ad-47dd-bcb0-3db9e6205f9c/actionmismatchaddressingexception?forum=wcf
解决方案是在soap header中加入wsa的header。大概代码为
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:Action>http://tempuri.org/xxx</wsa:Action>
</soap:Header>
代码 > 出色的golang sql操作库sqlx
2017-03-31
在用标准去的sql库裸写了博客和某个新浪爬虫后,还是使用了sqlx做新的内部项目。
总的来说,非常好用。
https://github.com/jmoiron/sqlx
总体来说,它最重要的特性包括:
1.NamedExec,用一个struct来储存所有的参数。最关键的,不需要每个参数都用到
2.get和select,可获得一个或者多个数据结构。不需要在一个一个写赋值了。
3.Named。可以对象和命名的查询字符串转为传统的查询字符串和args。为复杂的查询拼接提供了极大的帮助。
总体来说在性能影响尽可能小的情况下,大幅度的提高了开发的效率
代码 > 慎用golang中的append操作
2017-02-28
golang的slice是一个极好用的东西。
用slice自然少不得会使用append。
我自己做的midderware组块核心就是一个Func的slice
不知不觉就踩了一个坑。
具体来说,在加入csrf模块后,发现了奇怪的现象。
本来访问正常的页面,在路由加入2个middleware后报404,一个Middleware时不报。
为了解决这个问题,差不多把所有有关无关的代码都看了遍。无数的断点和测试,一步一步f11调试。
最后,锁定问题为:
在加入的middleware数量达到两个后,只有随后一个设置的路由起效。
调整代码顺序可以证实。
实在没办法后,脑洞大开。
觉得分明就是golang做了优化么,把相同的仅包含相同内容slice的struct当成了同一个。
把Use函数做了下修改
从
target.SetHandlers(funcs...)
改为
f:=make(funcxx,len(funcs))
copy(f,funcs)
target.SetHandlers(f)
问题解决
一瞬间我感觉到了地鼠对我有深深的恶意
代码 > 推荐Golang序列化库vmihailenco/msgpack
2017-02-27
之前用golang标准库的gob做2进制序列化,缓存页面。
用下来很难用,没法直接interface{}用自定义结构,使用前要先注册。
这次换了https://github.com/vmihailenco/msgpack这个库。十分好用。
和json库一样可以直接传入interface{}序列化/反序列化。
速度比gob快很多。
之前我Blog缓存过得页面,在我的rmbp13上速度大概是2x,xxxns
换为msgpack后直接提升为10,xxxns
去掉5,xxx必要的处理和middle之类
效率在我这个场景下高了3倍左右。
代码 > 不错的rest后台框架ng-admin
2017-02-27
重建网站后台时决定了用rest api做接口。
本来这也是驾轻就熟的事情,突然想到之后会做一个展示型网站的骨架/demo代码,用比较通用的代码比较好。
比较了一番相应的代码,选择了这个。
能很快的通过一系列的js配置搭建出常用的后台,ng 1.x也不需要各种编译。
有清晰的文档,和不少的讨论,解决问题非常方便。
还需要什么更多的要求呢?
项目地址:https://github.com/marmelab/ng-admin/
截图:

代码 > sqlitebrowser,很不错的sqllit数据库编辑器
2017-01-21
用golang做微博机器人爬语料,玩了下linux编译windows程序,找了这个工具来处理sqlite数据库。
开源,免费,有中文,跨平台
简单操作,易学易用
总的说很不错
代码 > golang初印象
2017-01-16
作为一个从Mud机器人正儿八经开始写程序的人,不管是nodejs还是golang,地一个练手项目都选择了mud客户端。
用了下golang,不惊艳,很舒服。
基本上。golang给我的感觉就是一个静态语言版的脚本,或者直接点说,python.
用:=,不需要事先申明变量类型
用interface,实现了脚本语言最重要的ducklike
几块的编译速度,go run xxx.go有种在跑脚本语言的感觉。
强制格式到自动格式化代码。比python更进一步。
很少的关键字。
很适合脚本程序与兼学。
学习成本太低。
虽然还是有很多问题。
但这么多语言,重要的是能做什么,而不是不能做什么。不适合的场景,不用就行了。
代码 > 2017年初,整理下自己的技能树,要有所取舍
2017-01-15
按写过的代码量统计。
1.php,吃饭的家伙,除非改变自己的工作中心,不然不可能绕过去。保持并深入。
2js,同php.区别在于nodejs。就nodejs本身来说,不够喜欢,但胜在和浏览器同源,投入成本极低。保持并深入。
3.lua.可以说,从这个语言开始,是我玩票记录的开始。这个也是我玩票记录的典型。接触熟悉lua是因为当年写的hellua机器人。作为我一个不甚喜欢的语言,突然发现,我的代码量是我不喜欢的语言的排行榜啊。前两个是脏,但实用。lua是简陋。但轻巧。放弃中。
4.python。玩过票,做过gui,折腾过网页程序,写过运维程序。作为一个运维语言,还是少不掉。保持。
5.C。当年做一个别人的毕业设计。和hellua的mapper。以我的功底,能力,行业,没什么前途的。了解过,不擅长,放弃吧。
6.c#。折腾过mono+gtk,读过别人的源代码。放弃吧,能读懂就好。
7.shell脚本。这个也就那样。保持。
8.vb,vbs,logo。入门的东西,忘记就行了。
没怎么接触过,基本之看过一些代码或者做过helloword的语言
9.golang.写过一个helloword。感觉还是有一些有意思的点。深入。
10.c++好像接触过一点,好像又没接触过。不是这块料,放弃吧……
11.Java。太庞大。无力挑战。一直以来没什么好的映像,怎的要选,估计选c#的概率更高。放弃。
12.perl与我哲学不符。放弃
13.ruby。不喜欢rails....放弃。
总结:
深入3个语言 php,js,golang
保持python,shell。
真的有需要,可以考虑学习下c#/java
果然还是菜鸟技能树啊。