- 博客(42)
- 资源 (5)
- 收藏
- 关注

原创 让业务代码更优雅的方法——类型工厂
最近碰到一个需求,用结构化数据结构(如JSON)构造一个表达式。已设计数据结构如下:// Value represents a value with given typetype Value struct { // type of this value: // number|string|boolean|object|array|expr Type string `json:"type"` Data json.RawMessage `json:"data"` // specific
2021-06-14 23:45:05
238

原创 重新认识Go的interface
实现了通用的JSON,YAML,XML相互转换的方法。Go interface是一种特殊的Go类型,不允许为该类型增加methodinterface{} 接收为赋值的 interface{}作为输入,得到的还是未赋值的interface{}<nil>interface{} 可赋值为 *interface,得到的是reflect.Ptr类型,只值为interface类型,可用于反序列化为任意的Go数据结构
2021-06-12 23:41:42
348

原创 一道笔试题展示的良苦用心——珍爱生命远离递归
通过一个递归增长速度远远大于斐波那契数列的笔试题目的代码优化效果,向读者展示一个核心编程思想:“珍爱生命,远离递归”。希望读者将“禁止使用一切形式递归纳入日常编程规范”。
2021-05-16 22:13:34
156

原创 在Go中用json序列化未知类型的巧妙方法
我们知道Go的json库可以方便的在json字符串和go类型之间相互转换。然而现实中经常遇到这样的需求,需要序列化的object类型是“未知”的,需要根据某个固定字段来判断用什么类型来序列化。如如下json数据表示animal数组的话,实际上所有的attr字段的具体类型是需要根据kind字段的值来确定的。这种数据表示在像javascript这样的动态语言表达起来很自然,但在go这样的静态类型语言里,描述起来就不是那么容易了。
2021-05-07 23:53:06
1665
6

原创 关于代码可读可维护问题的一些浅见
关于程序可读可维护问题的一些浅见,从在go语言中如何优雅的实现枚举映射,到理想编程语言的表达力及代码执行时机的一些思考。
2021-05-03 23:41:44
662
5

原创 像写诗一样撸代码是怎样的体验
关于容器空间扩容问题的精巧设计,实现过采用连续空间存储的序列式容器如vector,deque的同学都知道,由于需要在插入效率和动态扩容之间取得平衡,往往需要设计一个合理空间扩容策略,来满足大多数情况下的动态增长的需求且效率损失可控。
2021-05-01 23:03:06
309
2

原创 关于实时TopN排名算法的思考
关于实时TopN排名算法的思考0.引言1.TopN实时排名算法1.1 一个失败的方案1.2 现成的数据结构?1.3 合理的方案Reference0.引言实时排名是网络应用中常见的功能。根据需求不同,大概可以分为以下几类:i. TopN排名ii. 全数据排名作为通用需求,我们必须做如下假设:a. 用户基数较大b. 排名数据更新较频繁c. 用于排序的数据(score)范围不确定...
2018-11-21 20:49:38
3827
2

原创 golang中interface的一些语法缺陷的改进
GO语言有一个独门秘技:interface,是大师们对OOP的经典诠释,是对传统OOP思维的一个巧妙颠覆。既优雅地实现运行时多态,又不需要像C++那样显式申明,完美的解除了类型实现跟接口调用之间的耦合。Go语言的主要设计者之一Russ Cos曾经说过,如果只能选择一个Go语言的特性移植到其他语言中,他会选择接口。可见接口在GO中的地位,及其对GO这门语言所带来的活力。Russ Cos:...
2018-08-09 00:14:23
688

原创 一直被错爱的C/C++语法
最近在为dex-理想中的编程语言模型(https://github.com/dexlang/dex)整理一些资料发现C/C++的函数申明语法真的很奇怪:golang已经在官方blog详细说明为什么要改掉C的函数声明语法https://blog.golang.org/gos-declaration-syntax大意如下:C的函数声明语法:retType funcName(p...
2018-08-06 00:03:41
285

原创 Golang黑科技之——string与[]byte转换
我们知道,相对于C语言,golang是类型安全的语言。但是安全的代价就是性能的妥协。 下面我们通过Golang中的“黑科技”来一窥Golang不想让我们看到的“秘密”——string的底层数据。 通过reflect包,我们可以知道,在Golang底层,string和slice其实都是struct:type SliceHeader struct { Data uintptr Len
2016-10-27 00:09:19
38372

原创 论软件设计中的哲学观
所谓哲学,即跳出事物的表面现象,通过一些客观理性的分析,得出一些更接近事物本质的结论。从而以一种大世界的视角,来观察和解读这个世界。如道家所谓的“一”,佛家所云的“众生平等”。软件设计中的哲学观,即以一种“一”的视角,来评价和反思我们的设计,仅仅实现需求就是对的吗?第一次有人告诉我这个概念,是在大概10年前,我参加工作的第一个导师,一个偏执但让我很敬佩的华工怪才。当然那个时候初生牛犊,没有
2015-08-21 23:20:24
1947
原创 斐波拉契数列与黄金分割原理
斐波拉契数列是由兔子繁殖问题发现的神奇数列,由一个经典的递归定义:这个数列的前21项如下:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946斐波拉契数列神奇的地方在于,数列的相邻项(或相同间隔的项)之间的比值趋于常数。如:这就是神奇的黄金分割比例0.618的由来。由斐波拉契数列的特性,我们尝试定义一个满足斐波拉契数列和等比数列的新数列如下:由以上定义可知:FG(n+2)=FG(n)gg=FG(n+1)+
2024-03-18 23:18:10
713
原创 关于web分页展示功能的设计
分页展示功能是web中最常见的功能之一传统的api设计方法是把所有数据排序,并按pageSize分成若干段,根据传入参数page取对应的分段的数据乍一看,这个设计很传统,也很自然,没毛病但是仔细研究后,发现这种设计无论从性能还是人性化方面,都有毛病我们来考虑一个常用场景,新数据在不断加入,如分页展示一个论坛主题数据数据按时间戳排序,肯定是希望最新的数据在第一页展示,即新数据在列表头部不断加入按照传统设计,当数据集发生变化,则重新刷新页面,所有页面的数据都会发生变化,这就像从vecto
2020-12-30 22:44:57
441
原创 GO语言带调试日志的锁
死锁在多线程中经常遇到,有时候看代码很难发现问题,带调试日志的锁,准确记录锁的周期,等待时间,读写竞争情况,Lock、Unlock是否匹配,方便找出死锁发生的各种原因https://github.com/vipally/glab/blob/master/lab22/debug_lock.gopackage debuglockimport ( "bytes" "fmt" "runtime" "strconv" "sync" "sync/atomic" "time")const
2020-09-17 00:14:40
174
原创 【linux】VirtualBox下ubuntu系统静态桥接网络配置的各种坑
目录0.网络配置目标1.VirtualBox的四种网络连接方式2.桥接模式的各种坑2.1 桥接网络无法获取ipv4地址2.2 桥接网络可以获取ipv4地址,但是无法ping宿主机2.3 桥接网络可以ping通宿主机,但是无法ping通网关2.4桥接网络可以ping通网关和访问internet,但是内网ip是动态的2.5大功告成,为VM配置独立静态内网IP实现所有网络目标安装过程已在这篇博客分享https://blog.youkuaiyun.com/vipally/article/..
2020-07-02 19:39:56
1081
原创 【linux】VirtualBox安装ubuntu虚拟机并且实现跟宿主机互相ping通和共享文件夹
目录1. 用默认配置创建虚拟机2. 安装过程3. 安装后配置3.1 将时区切换到北京时间3.2 让root用户可以登录并且可以用xshell远程登录3.3 安装unbuntu安装VBox Addon3.4 设置HOST-VM共享文件夹a.选择菜单 “设备/共享文件夹”b.选择菜单 “设备/共享粘贴板/双向”c.选择菜单 “设备/拖放/双向”d.虚拟机关机3.5 用“桥接模式”实现宿主机与VM网络互通a.virtualBox需要设置网络连接方式为 “桥接网.
2020-07-01 15:53:20
1470
原创 分享一种科学管理各种shell脚本的方法
后端管理经常会遇到各种脚本直接存放在服务器上甚至直接在服务器上修改的问题这样做既无法管理脚本修改历史,也没法实现批量部署的需求一个较好的方法是通过git管理这些脚本,没类脚本在自己独立的目录和分支下管理,部署的时候只需要在服务器上拉取对应的分支即可完成统一更新,非常方便...
2020-04-14 17:01:56
223
原创 不要使用有副作用的std.map.[]操作符
map的[]操作符包含隐性操作:当key不存在的时候,会默认执行insert操作这种隐性操作在大多数情况下是有害的。
2017-05-05 15:02:51
606
原创 慎用频繁小块内存申请,让程序健步如飞
最近碰到一个应用,为一块已经载入内存的Tab文件生成一个动态数组用于建立单元格数据索引表。当然这也算是C vs C++的一个典型例子吧。由于事先不知道Tab文件的行数和列数,无法预先生成动态数组。方案1:首先想到的是遍历整个文件,用一个临时map记录每个单元格的索引信息,并计算出表格的行数和列数。然后申请根据行数和列数申请一个合适大小的动态数组,并将临时map中的数据搬到动态数组中,这样只需要
2016-11-13 14:40:29
2087
原创 mysql数据库存储引擎让我崩溃了
好久没跟数据库死磕了,这次是真被数据库死磕了。 windows下没有任何问题,移植到linux下,老区没有任何异常情况,新区大量复制装备,后台工具运行期间,角色无法正常登陆,服务器显示运行状态良好。以前用得蛮好的工具,在新区数据库才40万数据带索引一条update语句要1分钟,而且update返回后,fetchdata操作终止,mysql返回2013(connetion lost)错误。 看到这
2016-11-13 14:34:10
702
原创 用float/double作为中转类型的“雷区”
由于lua用double作为number类型的底层数据中转类型。而实际应用中多以int类型作为函数调用的参数(特别是C实现的API)。因而,double/int/unsigend int之间的数值转换在接入lua的项目中应用十分广泛。实际项目发现,double/int/unsigend int之间的数值转换存在一个**严重且极容易被忽视的"雷区"**。
2016-11-13 13:55:05
2399
原创 Golang仿函数实现方法及效率测试
在C++ STL中,仿函数(functors)被大量用作改变算法的内在行为。 由于Golang不支持泛型,所以没法像C++那样灵活的使用仿函数。但是Golang有interface,函数是”一等公民”(可赋值给指定类型变量),因此,在Golang中实际上也可以像仿函数那样,通过具有相同参数和返回值的方法声明的不同对象,实现行为的差异化。 下面,详细讲述,Golang中的实现方法: 以下通过不同
2016-10-30 22:35:38
1468
原创 基于环形缓冲区的deque实现方法
众所周知,C++ STL中有一个叫做deque的容器,实现的是双端队列数据结构,这种队列允许同时从队列的首部和尾部插入和删除数据。 然而在STL中这种数据结构是用”分段连续”的物理结构实现的(可以参考侯捷老师的《STL源码剖析》)。网上分析STL中这种容器的文章很多,如: http://blog.youkuaiyun.com/baidu_28312631/article/details/48000123
2016-10-20 00:50:50
1923
原创 不要让递归函数fuck大家的cpu
递归算法是大学计算机课程里面经常会讲到的编程方法,因为采用这种方法写出来 的代码清晰易懂。但是,在大多数编程规范里面,会严令禁止使用递归函数,原因下面来详细说明。首先,由于逻辑错误,由直接或间接递归,造成递归调用无法结束(死递归),最后肯定会收到一个"stack overflow"的宕机信息。就暂且不论了。下面要详细讨论的是,简单的递归代码是如何fuck计算机运行时系统的。这里用计算Fibonacc
2016-10-13 22:50:30
2329
原创 installgithub-支持断点续传下载GitHubDesktop离线安装文件
用GitHub账号提交代码的都希望下载本地客户端克隆仓库https://desktop.github.com/可是在天朝用GitHub.exe在线下载安装这个客户端实在是太难了由于不支持断点续传 公司千M光纤外带翻墙都无法成功下载这个玩意于是写了一个工具,下载GitHubDesktop代码在这里欢迎拍砖https://github.com/vipally/insta
2016-08-26 09:33:08
4136
1
原创 cmdline-扩展golang std.flag
基于golang 1.6.2 flag 源码做了一个扩展 使命令行帮助信息更完整更清晰,更易于使用 源码地址: http://github.com/vipally/cmdline//Ally(vipally@gmail.com) modify from std.flag version 1.6.2 //1. Add LogicName and Required field for every
2016-08-16 23:13:51
646
原创 linux下用gdb实现程序宕机时自动打印调用堆栈
linux下程序运行几天莫名其妙宕机了,不能还原现场,找到宕机原因就很无语了。一个解决办法是使用core文件,但是对于大型服务器文件,动辄几百M的core文件是在有点伤不起,于是想到程序宕机时自动打印调用堆栈。简单实用。废话不多说,直接上方案:方案1:使用gdb指令列表文件启动程序并监控之启动指令 gdb -x gdb_start.ini以下是gdb_start.ini文件内容:
2014-11-09 19:55:57
2386
原创 [golang]让golang支持泛型编程的一种方案
本博客原创博文版权所有 @Allyvipally@gmail.com仅供交流学习使用用于商业用途请联系原作者 转载请注明出处:http://blog.sina.com.cn/ally2014总所周知,golang现在不支持泛型编程,对于习惯了C++泛型编程思想的程序员来说无疑是一个硬伤。虽然golang interface{}多少可以满足一些泛型需求,但是无论在效率和编程手法上,都
2014-11-09 19:55:54
3126
原创 [golang]golang reflect详细用法整理
本博客原创博文版权所有 @Allyvipally@gmail.com仅供交流学习使用用于商业用途请联系原作者 转载请注明出处:http://blog.sina.com.cn/ally2014 最近在尝试用Go写一些东西,发现Go不支持泛型确实是一件比较蛋疼的事,同样功能的一个类,只有底层数据结构有一点点差异,需要实现N遍。特别像我这种在C++世界挣扎也纠结了很多年,用惯了模板编程思想
2014-11-09 19:55:51
16504
转载 golang的初始化顺序
Init每个包都可以定义一个或多个init函数2(原型为 func init()),init函数在包初次被导入时调用,同一个包内的多个init函数的执行的顺序是不定的,而如果这个包又导入了其他的包,则级连调用,所有包import完成,所有init函数执行完后,则开始main的执行。而对于全局变量,以一个简单的例子来说明: // package p var gInt int… // p
2014-11-09 19:55:49
1088
原创 [golang]从golang中的Slice和strin…
type SliceHeader struct { Data uintptr Len int Cap int}type StringHeader struct { Data uintptr Len int}以上数据结构来源于package reflect有
2014-11-09 19:55:46
402
转载 Golang反射调用函数
首先,来看看这段 PHP 代码:view sourceprint?1functionfoobar() {2 echo"Hello Golang\n";3}4$funcs= array(5 "foobar"=> "foobar",6 "hello"
2014-11-09 19:55:44
1471
转载 golang中的defer panic使用方法
大家都知道golang里的panic相当于其他语言里的throw,而recover相当于其他语言里的cacth,可是由于golang的recover机制要求必须在defer的函数里才能执行catchpanic大概意思如下func protect(g func()) { defer func() { log.Println("done") //Println executes n
2014-11-09 19:55:41
814
转载 go deadlock
原文地址:deadlock">go deadlock作者:funkygao 1 package main 2 3 func main() { 4 ch:= make(chan int) 5 ch 6 7 } 上面的代码,在执行时会报:throw: all goroutines are asleep - deadlock!原因是
2014-11-09 19:55:39
547
原创 [Golang]golang中自动锁的实现
golang作为原生支持多线程的语言,为了实现线程安全的package,经常需要对全局变量自动加锁,以便安全的访问全局变量。废话不多说,直接上代码:package mainimport ( "sync" "fmt")type AutoLock struct { obj interface{} lock sy
2014-11-09 19:55:36
1321
原创 [Golang]如何在golang程序中自动获取编译时间的方法
在程序发布之后,经常需要识别程序的版本号,来确定一些问题是否因为程序未更新造成的,其中通过在程序启动日志中输出编译时间是最有效方法。在golang中没有C语言__FILE__,__LINE__,__DATE__,__TIME__这些好用的编译期常量给我们使用,好在golang提供了强大的cgo在go代码中嵌入C代码的方法,可以实现这个需求。废话不多说,直接上代码:package ma
2014-11-09 19:55:33
2459
原创 VisualSVN版本升级导致旧的版本库…
最近windows重装系统,将本地VistualSVN服务器的升级到2.5.6,将旧服务器数据迁移到新的服务器,迁移过程很简单,只是将旧SVN的Repository复制到新服务器,再将新服务器的SVN库指向该目录。客户端工作目录realocate到新的服务器地址,update和showlog没有问题,但是提交的时候出现如下错误:服务器发送了意外的返回值(500 Internal Serv
2014-11-09 19:55:31
2361
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人