GO到底适合干什么?
LZ最近从上家公司java转到go,工作内容还是主要业务逻辑代码,感觉go写起来不是很顺畅(oop思想可能根深蒂固了,语言熟练度也是一个原因),一个Orm框架用起来就特别麻烦。。。个人感觉基于go的特性还是做一些基础的服务器组件会很有优势。。写一般的业务代码简直别扭。。没泛型、if err != nil等等.. 当然好处就是很多东西要自己实现,没有可靠的轮子。。。大家都用GO做什么呢...阅读全文
LZ最近从上家公司java转到go,工作内容还是主要业务逻辑代码,感觉go写起来不是很顺畅(oop思想可能根深蒂固了,语言熟练度也是一个原因),一个Orm框架用起来就特别麻烦。。。个人感觉基于go的特性还是做一些基础的服务器组件会很有优势。。写一般的业务代码简直别扭。。没泛型、if err != nil等等.. 当然好处就是很多东西要自己实现,没有可靠的轮子。。。大家都用GO做什么呢...阅读全文
Go提供了两种size的浮点数,float32和float64。它们的算术规范是由IEEE754国际标准定义,现代CPU都实现了这个规范。 浮点数能够表示的范围可以从很小到很巨大,这个极限值范围可以在math包中获取,math.MaxFloat32表示float32的最大值,大约是3.4e38,math.MaxFloat64大约是1.8e308,两个类型最小的非负值大约是1.4e-45和4.9e-324。 float32大约可以提供小数点后6位的精度,作为对比,float64可以提供小数点后15位的精度。通常情况应该优先选择float64,因此float32的精确度较低,在累积计算时误差扩散很快,而且float32能精确表达的最小正整数并不大,因为浮点数和整数的底层解释方式完全不同,具体见I...阅读全文
概述 前端作为和用户直接交互相关的开发人员,后端开发则涉及到更多用户看不到的领域,如对数据的存储、加工,平台稳定性、安全性等各个方面,因为涉及到的开发面广,几乎各种语言都运用到了后台开发,比如阿里巴巴的Java生态,百度PHP,Golang。语言并不是后端的限制,作为一名好的后端,学习的是后端的思想:如何搭建更高效的系统?也因此一部分后端的发展规划是“架构师”。 MVC模式 在十几年前MVC模式就已经存在了,可以说是一个非常经典的入门开发模式。但几十年前的代码规模及理念和如今也大不一样。过去的开发并不会分什么前端后端,大家都是一起开发,但现在提倡的是前后端分离,各司其职,同时开发,MVC模式也发生了相应的变化,这里我讲解下我理解的如今MVC基本概念。 后端开发MVC 上图是MVC开发的简单流...阅读全文
编程语言是开发者们代码工作的核心,也是许多开发者最爱讨论的话题。编程语言的选择对开发者和工具制造商都十分重要,前者需要保持最新和具备市场潜力的技能,后者则亟需确保他们能够提供最有用的 SDK。 开发者经济分析公司 SlashData 曾发布了《 2018 年第 2 季度各国开发者状况》调查报告,共有 167 个国家的 20500 多名开发者参与其中。 报告面向全球所有类型的程序员,对使用每种主要编程语言的活跃开发者数量进行了最新的估计。其中,JavaScript 仍是最流行的编程语言,Python 流行程度接近 Java。 image 哪种语言最难学呢?每个人也许都有着自己的想法,衡量标准各不相同。 现在我们从一个全新的,无可反驳的角度来分析一下各个编程语言难学程度。 第十名、R语言 颁奖词...阅读全文
前段时间发布了一个小小的web开发项目骨架morningo,性能与效率齐飞,开发速度在短暂时间熟悉go语言后应该是匹配php,ruby等这些脚本语言,而后期项目并发性能,基本并发到上千乃至上万tcp连接没问题。但从业务架构层面看,项目再发展,数据库存在瓶颈,单体项目耦合度高,可维护性差,可延展性差,存在很多问题。因而项目早期可以采用单体架构,但后期仍然推荐的是面向服务的分布式架构。分布式的架构模式虽然带来了增加的代码量,服务间沟通的成本,但整体项目更具有弹性,延展性更好。 项目地址:https://github.com/chenhg5/ko gokit介绍 go语言的优点不用赘述,那么基于go的微服务框架有吗?gokit就是一个go语言相关的微服务工具包。它自身称为toolkit,并不是fr...阅读全文
互联网的出现不但改变了普通人的生活方式,同时也促进了技术圈的快速发展和开放。在开源和分享两股力量的推动下,最近 10 多年的技术发展可以说是目不暇接,你方唱罢我登场,大的方面有大数据、云计算、人工智能等,细分的领域有 NoSQL、Node.js、Docker 容器化等。各个大公司也乐于将自己的技术分享出来,以此来提升自己的技术影响力,打造圈内技术口碑,从而形成强大的人才吸引力,典型的有,Google 的大数据论文、淘宝的全链路压测、微信的红包高并发技术等。对于技术人员来说,技术的快速发展当然是一件大好事,毕竟这意味着技术百宝箱中又多了更多的可选工具,同时也可以通过学习业界先进的技术来提升自己的技术实力。但对于架构师来说,除了这些好处,却也多了“甜蜜的烦恼”:面对层出不穷的新技术,我们应该采取...阅读全文
说明 上一篇说的是线性表中的顺序存储结构,他的读取复杂度虽然是o(1),但是它的缺点也很明显,插入和删除需要移动很多元素,而且需要分配一块连续的内存区域 线性表之单链表 单链表在一定程度上解决了一部分上面的问题,而且也不要一大块连续的内存区域,代码如下 package main //线性表中的链式存储结构 //第一个节点为头节点,并不真实保存数据,头节点基本代表了整个链表 import ( "fmt" ) type Elem int type LinkNode struct { Data Elem Next *LinkNode } //生成头节点 func New() *LinkNode { //下面的data可以用来表示链表的长度 return &LinkNode{0, nil} } //...阅读全文
heap包对任意实现了heap接口的类型提供堆操作。(小根)堆是具有“每个节点都是以其为根的子树中最小值”属性的树。树的最小元素在根部,为index 0. heap是常用的实现优先队列的方法。要创建一个优先队列,实现一个具有使用(负的)优先级作为比较的依据的Less方法的Heap接口,如此一来可用Push添加项目而用Pop取出队列最高优先级的项目。 type Interface type Interface interface { sort.Interface Push(x interface{}) // add x as element Len() Pop() interface{} // remove and return element Len() - 1. } 可以看出,这个堆结构继...阅读全文
在go语言中,接口赋值分为2中情况: 1、将对象实例赋值给接口; 2、将一个接口赋值给另一个接口。 1、将对象实例赋值给接口: 要求对象实现了接口的所有方法。 2、将接口赋值给另一个接口: 假设接口A中定义的所有方法,都在接口B中有定义,那么B接口的实例可以赋值给A的对象。反之不成立,除非A和B定义的方法完全一样(顺序不要求),这时A和B等价,可以相互赋值。 3、类实例化时指针或者实例区别: 实例化类的时候,一般有2个方法: (1) 用new(structName):这个方法得到的是*structName类型,即类的指针类型; (2) 用structName{init para}:这个方法得到的是structName类型,即类的实例类型,不是指针。 注意: 类在实现接口的时候,要注意定义的时...阅读全文
Go Map介绍 Go 中 Map是一种无序的键值对的集合。Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值。Map是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map是无序的,我们无法决定它的返回顺序,这是因为Map是使用链式hash表来实现的。 c++中的实现 在C++ STL 中map 采用红黑树实现,可以实现有序的Map. Go 中实现 实现原理 这个实现方法的主要的方法是用空间换取时间。通过list 和 map 两种数据结构,保存相同的一份数据。list 用来做顺序遍历,map 用来做查找,删除操作 实现代码 package main import ( "container/list" "fmt" ) type Keyer interface...阅读全文
感觉MD5算法复杂度比crc32高很多,具体高多少呢?测试一下 // main.go package main import ( "crypto/md5" "fmt" "hash/crc32" ) func main() { data := []byte("test") fmt.Printf("%x", md5.Sum(data)) } func Crc32IEEE(data []byte) uint32 { return crc32.ChecksumIEEE(data) } func Md5(data []byte) [16]byte { return md5.Sum(data) } // main_test.go package main import "testing" func Be...阅读全文
Go container包 container/list-双向链表-List 基本的数据结构 type Element struct { // Next and previous pointers in the doubly-linked list of elements. // To simplify the implementation, internally a list l is implemented // as a ring, such that &l.root is both the next element of the last // list element (l.Back()) and the previous element of the first list // ...阅读全文
摘要: 从2008年到2018年,从阿里巴巴中间件团队到飞天八部——小邪与阿里的十年。 编者按:从2008年到2018年,从阿里巴巴中间件团队到飞天八部——小邪与阿里的十年。 2008年4月,小邪正式入职阿里巴巴,首次接触淘宝商城项目开启了其十年的阿里技术生涯,去年12月加入阿里云,任飞天八部掌门人。本文邀请到小邪进行了专访,就其在阿里十年的经历进行了深入的访谈,此外他还分享了阿里的技术发展史以及他的职业生涯感悟。 阿里云研究员、飞天八部掌门人蒋江伟(花名:小邪),原阿里巴巴中间件团队负责人。 一切从淘宝商城谈起 小邪加入阿里正值淘宝商城(现天猫)公测阶段,而这也是他来到阿里的第一个项目。这几乎是一个和淘宝并行的项目,工程之浩大可想而知,当时小邪主要负责品牌...阅读全文
fasthttp中的协程池实现 协程池可以控制并行度,复用协程。fasthttp 比 net/http 效率高很多倍的重要原因,就是利用了协程池。实现并不复杂,我们可以参考他的设计,写出高性能的应用。 入口 // server.go func (s *Server) Serve(ln net.Listener) error { var lastOverflowErrorTime time.Time var lastPerIPErrorTime time.Time var c net.Conn var err error maxWorkersCount := s.getConcurrency() s.concurrencyCh = make(chan struct{}, maxWorkersC...阅读全文
下一代CoreOS的容器使用基于Intel的硬件隔离来增加安全性。其他容器系统也会如法炮制吗? 既然Open Container Initiative(OCI)承诺让所有的容器都殊途同归, 但是除了Docker,其他容器技术都停止发展了吗?答案是否定的。以CoreOS为例,它正在加速发展。 CoreOS,利用Docker的许多idea,打造了另一个容器系统Rocket。一直高调宣传以安全和简单来标榜自己的容器特性,Rocket 0.8 (又名rkt)带来了基于Intel工程设计特性,CoreOS声称在其他容器上暂时还没有发现。 Rocket 0.8利用了Intel的 Clear Containers项目,它在英特尔芯片中使用VT-x指令集为容器增加硬件隔离。事实上,Inte...阅读全文
它的计算规则是: 函数的基本复杂度是 1,然后每有一个 'if','for','case','&&' 或 '||' 则 +1 https://github.com/fzipp/gocycl...阅读全文
 学习嵌入式的过程,是一个不断积累,不断实践的过程。毕竟,一名有成就的程序员不是一蹴而就的,下面是来自一个嵌入式开发高级工程师为我们总结的关于嵌入式开发学习的13大法则,大家不妨参考一下: 一、资源有限性法则 嵌入式计算不仅需要网络快速、一致的计算,而且也要求系统能够井然有序地将其执行代码和数据,存储在一个“共同”的“狭小”的空间内。 二、冗余度法则 在嵌入式系统具有足够的冗余度之后,系统的“初始敏感性”对于其“最终计算结果”的影响就变得微乎其...阅读全文
RAW SOCKET 介绍 TCP/IP协议中,最常见的就是原始(SOCKET_RAW)、tcp(SOCKET_STREAM)、udp(SOCKET_DGRA)三种套接字。原始套接字能够对底层传输进行控制,允许自行组装数据包,比如修改本地IP,发送Ping包,进行网络监听。这里不做详细介绍,要了解更多可以网上自己查询。 实现 这里先看IP头结构: 其中16位总长度包括IP头长度和数据的长度,8位协议填写17,因为UDP协议类型为17。这里要说明一下IP头中的首部校验,这个值只校验IP头部,不包含数据。这里给出校验算法,IP头和UDP头中使用的校验算法是一样的。 func checkSum(msg []byte) uint16 { sum := 0 for n := 1; n < len(ms...阅读全文
对于一个不稳定的语言,删删改改什么的都是常事。即便是稳定的语言,也逃不过隔三差五整修一下的命运。于是 Golang 大修是个麻烦。 用 Golang 的好处是你正在使用世界上最聪明的一群科学家和工程师的杰作。于是,升级这些麻烦事变得不那么麻烦了,因为有了 gofix。 原文在此:http://blog.golang.org/2011/04/introducing-gofix.html ——————————-翻译分割线——————————- gofix介绍 下一个 Go 的发布版将会包含多个官方 Go 包 API 的重大变化。实现 HTTP 服务器处理、调用 net.Dial、调用 os.Open,或者使用反射的代码如果不使用新的 API 升级,将无法编译。现在的发布已经相当稳定并且不那么频繁...阅读全文
选择排序 选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。 选择排序是不稳定的。算法复杂度是O(n ^2 )。 package main import ( "fmt" ) type SortInterface interface { sort() } type Sortor struct { name string } func main() { arry := []int{6, 1, 3, 5, 8, 4, 2, 0, 9, 7} learnsort := Sortor{name: "选择排序--从小到大--不稳定--n*n---"} learnsort.sort(ar...阅读全文
自冯诺依曼开启大计算机时代以来,经过近一个世纪的蓬勃发展,已然成为一个人才众多的群体:IT江湖。 依附市场规律,江湖上悄然兴起数十宗门,其中以AI,大数据近期最为热门。 每个宗门人才济济,抢夺人才大战早已在阿里,腾讯,百度等数百个国度白热化。 IT江湖人士凭借JAVA,Python等武器,在精通各路内功心法的基础上在各个国度扬名立万,修仙成佛者众多,为后人树下追宠之榜样。 内功心法众多,其中以算法最为精妙,是修仙德道必经之路。 虽然江湖上算法内功繁多,但是好的算法小编认为必须符合以下几个条件,方能真正提高习练者实力。 时间复杂度(运行时间) 在算法时间复杂度维度,我们主要对比较和交换的次数做对比,其他不交换元素的算法,主要会以访问数组的次数的维度做对比。 其实有很多修炼者对于算法的时间复杂度...阅读全文
没事的时候打算开始玩一玩leetcode,不然天天写代码,却对算法没啥认识还是有点尴尬的。虽说是做题,其实大部分就是为了看看别人牛逼的思路。尽量每天一题把~ 1.两数之和 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 第一种方法就是便利数组,随着数组长度增加,执行时间指数型增加。 #时间复杂度:O(n^2) #空间复杂度:O(1) func twoSum(nums []int, target int) []int { for firstIndex...阅读全文
java的锁和CAS都是开销惊人的(锁会调用本地系统进行线程阻塞和唤醒开销巨大). Actor的消息队列也会有自己的严重问题(使用Actor又会使得编程复杂度大大提高). 所以分布式开发其实是按照业务特性,妥协出最优方案. 在写少读多的并发场景下:clojure的STM,通过多版本控制以空间换时间,提供了类似MVCC的内存事务回滚, ,简单高效到了极致. 大量写的情况下go/rust在CAS上抽象出的task机制也可以让CAS开发变得相当简单 版权声明:本文为博主原创文章,未经博主允许不得转载...阅读全文
自冯诺依曼开启大计算机时代以来,经过近一个世纪的蓬勃发展,已然成为一个人才众多的群体:IT江湖。依附市场规律,江湖上悄然兴起数十宗门,其中以AI,大数据近期最为热门。每个宗门人才济济,抢夺人才大战早已在阿里,腾讯,百度等数百个国度白热化。IT江湖人士凭借JAVA,Python等武器,在精通各路内功心法的基础上在各个国度扬名立万,修仙成佛者众多,为后人树下追宠之榜样。 内功心法众多,其中以算法最为精妙,是修仙德道必经之路。 虽然江湖上算法内功繁多,但是好的算法小编认为必须符合以下几个条件,方能真正提高习练者实力。 时间复杂度(运行时间) 在算法时间复杂度维度,我们主要对比较和交换的次数做对比,其他不交换元素的算法,主要会以访问数组的次数的维度做对比。 其实有很多修炼者对于算法的时间复杂度有点模...阅读全文
先说结论:没有少走的弯路。走过的弯路最终都会成为自身的财富。前言:如果在开始学习之前,就想着能少走弯路,那多半会走不少弯路。因为关注的重点错了,把本来是踏踏实实学习编程知识的时间,都用来寻找少走弯路的方法了。一、盯住一个问题牢牢不放,不搞定这个问题,绝不向下走。一股子不到长城非好汉的决心,有这么强大的毅力学习是对的,这也是大多初学者容易走的弯路,学习之初先了解大致的概念,上来就寻根究底,会让自己变得疲惫不堪,因为初学小白开始很难具备强大的基础,很难把每个知识点都吃的相当透彻,所以开始学习的时候,先了解基本的方向和思路,掌握一些概念或者工具如何使用,等你慢慢的掌握了编程语言的整个套路,之前遇到的问题可能也就迎刃而解了。二、在学习基础语言的时候,一直怀疑所学语言是不是能找到工作,中间换了几种语...阅读全文
[TcpRoute](https://github.com/GameXG/TcpRoute), TCP 层的路由器。对于 TCP 连接自动从多个线路(允许任意嵌套)、多个域名解析结果中选择最优线路。TcpRoute2 是 golang 重写的版本。 通过 socks5 代理协议对外提供服务。 代理功能拆分成了独立的库,详细代理url格式级选项请参见 [ProxyClient](https://github.com/GameXG/ProxyClient),目前支持直连、socks4、socks4a、socks5、http、https、ss 代理线路。 ## 安装 在 [releases](https://github.com/GameXG/TcpRoute2/releases) 页面有...阅读全文
==算法主要衡量标准== 时间复杂度(运行时间) 在算法时间复杂度维度,我们主要对比较和交换的次数做对比,其他不交换元素的算法,主要会以访问数组的次数的维度做对比。 其实有很多同学对于算法的时...阅读全文
关于软件测试与游戏测试的区别,网上也有几篇文章提到,但是感觉没有描述的特别清晰,原因无非2点:一是即做过软件测试又做过游戏测试的人本身不多,二是在软件和游戏测试都做过的这一小撮人里善于归纳总结的更是少之又少。 游戏本质也是软件的一种,所以从测试工程的角度来讲,游戏测试与软件测试的本质是完全相同的。2者的不同更多的是在表象层面,我们可以把游戏测试看作软件测试的子类,它继承了软件测试这个父类的特性,又有自己的一些新特性。 通过归纳总结,我把游戏测试相对软件测试的不同归纳为以下几点: UI&&UE 数值 活动 进度 工具 性能 安全 合服 交互 网络 下面我们就每一点来详细探讨下。 1,UI&&...阅读全文
希尔排序 希尔排序基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2《d1重复上述的分组和排序,直至所取的增量dt=1(dt《dt-l《…《d2《d1),即所有记录放在同一组中进行直接插入排序为止。 该方法实质上是一种分组插入方法。 个人总结: public class ShellSorter { public void Sort(int[] arr) { int inc; for (inc = 1; inc <= arr.Length / 9; inc = 3 * inc + 1) ; for (; inc > 0; inc /= 3) { for (int i = ...阅读全文
除了上篇介绍的二分插入排序,还有这次介绍的希尔排序(Shell's Sort),也是对直接插入排序算法的优化。 原理希尔排序,就是按某个增量值对数据进行分组,每组单独排序好后,再缩小这个增量,然后按新增量对数据分组后每个分组再各自排序。最终增加缩小到1的时候,排序结束。所以希尔排序又叫缩小增量排序(Diminishing Increment Sort) 关于增量最佳增量值的选择其实是个数学难题,有兴趣的可以自己搜下相关资料。常用的增量有 n/2(这个又叫希尔增量)、n/3、2^k-1(hibbard增量)等,实际使用中稍微改版增量也可能使排序的性能产生很大的波动。比如使用n/2的增量,就是初始增量就是 length/2 ,第二轮分组时就再除2:length/4,直至增量值变成1 流程假设有个...阅读全文
之前发表一个A*的python实现,连接:点击打开链接 最近正在学习Go语言,基本的语法等东西已经掌握了。但是纸上得来终觉浅,绝知此事要躬行嘛。必要的练手是一定要做的。正好离写python版的A*不那么久远。这个例子复杂度中等。还可以把之前用python实现是没有考虑的部分整理一下。 这一版的GO实现更加模块化了,同时用二叉堆来保证了openlist的查找性能。可以说离应用到实现工程中的要求差距不太远了。 package mainimport ( "container/heap" "fmt" "math" "strings")import "strconv"type _Point struct { x int y int view string}//=====================...阅读全文
编程语言是开发者们代码工作的核心,也是许多开发者最爱讨论的话题。编程语言的选择对开发者和工具制造商都十分重要,前者需要保持最新和具备市场潜力的技能,后者则亟需确保他们能够提供最有用的 SDK。开发者经济分析公司 SlashData 曾发布了《 2018 年第 2 季度各国开发者状况》调查报告,共有 167 个国家的 20500 多名开发者参与其中。报告面向全球所有类型的程序员,对使用每种主要编程语言的活跃开发者数量进行了最新的估计。其中,JavaScript 仍是最流行的编程语言,Python 流行程度接近 Java。 哪种语言最难学呢?每个人也许都有着自己的想法,衡量标准各不相同。现在我们从一个全新的,无可反驳的角度来分析一下各个编程语言难学程度。第十名、R语言颁奖词R语言,一种自由软件编...阅读全文
传送门:Hdu 5193 Go to movies Ⅱ 题意: 有n个人站成一排,每个人的身高为Hi。每次有人加入或者有人离开,就要判断有多少人站反了(i < j&&Hi>Hj) 第一行n,m,接下来n个整数(n,m<=2e4) 接下来m行, 0 x y 表示有一个身高为y的人插在x后面,x=0表示插在最前面。(1≤y≤n) 1 x 表示第x个人(从左到右)离开。 思路:摘自题解http://bestcoder.hdu.edu.cn/solutions.php?page=12 添加或者删除一个元素时,维护逆序对时,需要知道在它之前有多少个数比它大,在它之后有多少个数比他小。有下标和权值两个维度,可以使用两个数据结构嵌套。题目中n=20000,范围不大,外层可以使用分块维护下标,这样添加和删除...阅读全文
PHP 15-30K 1、精通PHP程序设计,精通Mysql、Oracle数据库,熟悉数据库优化; 2、精通PHP开源构架及WEB SERVICE HTML/ DHTML/ XML/ CSS /AJAX等技术; 3、有日均千万级数据的开发经验; 4、在技术队伍的建设和管理、人员配置与协调、项目进展的监控等方面有丰富管理经验,具有战略思维和良好的团队激励的能力; 5、对互联网具有一定的敏锐度,能够从客户和业务的角度来进行技术实现,并能及时掌握市场发展动态,对公司技术发展能提供决策性的建议; 6、积极上进、能承受压力,愿意在创业公司一起成长奋斗 LINUX运维 10-20K 1、大专及以上学历,2年以上互联网公司linux运维经验; 2、熟悉下面一项的服务器编程语言,...阅读全文
题目描述 请判断一个链表是否为回文链表。 示例1: 输入: 1->2 输出: false 示例2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 解题思路 思路1 遍历链表,用数组存下每个节点的值,然后从数组两头开始向中间遍历,是否相等 时间复杂度O(n),空间复杂度O(n) 思路2 遍历一遍链表,得到链表长度n,根据长度的奇偶,找到中间节点,将左半边的链表反转,然后从中间节点分两个方向向左右两边遍历,是否是回文;对左半部分链表进行反转,还原为最初的链表 只需要固定的若干个临时变量,不需要额外开辟空间 时间复杂度为O(n),空间复杂度为O(1) 代码实现 // ListNode Definition for sing...阅读全文
归并排序 归并排序是一种分治策略的排序算法。它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列。 归并排序首先由著名的现代计算机之父John_von_Neumann在1945年发明,被用在了EDVAC(一台美国早期电子计算机),足足用墨水写了 23 页的排序程序。注:冯·诺依曼(John von Neumann,1903年12月28日-1957年2月8日),美籍匈牙利数学家、计算机科学家、物理学家,是20世纪最重要的数学家之一。 一、算法介绍 我们先介绍两个有序的数组合并成一个有序数组的操作。 先申请一个辅助数组,长度等于两个有序数组长度的和。 从两个有序数组的第一位开始,比较两个元素,哪个数组的元素更小,那么该元素添加进辅助数组,然后该数组...阅读全文
版权声明:本文为Sunface(孙飞)原创文章,转载请注明出处 https://blog.csdn.net/abv123456789/article/details/50904902 Go提供了两种size的浮点数,float32和float64。它们的算术规范是由IEEE754国际标准定义,现代CPU都实现了这个规范。 浮点数能够表示的范围可以从很小到很巨大,这个极限值范围可以在math包中获取,math.MaxFloat32表示float32的最大值,大约是3.4e38,math.MaxFloat64大约是1.8e308,两个类型最小的非负值大约是1.4e-45和4.9e-324。 float32大约可以提供小数点后6位的精度,作为对比,float64可以提供小数点后15位的精度。通常情...阅读全文
编程语言是开发者们代码工作的核心,也是许多开发者最爱讨论的话题。编程语言的选择对开发者和工具制造商都十分重要,前者需要保持最新和具备市场潜力的技能,后者则亟需确保他们能够提供最有用的 SDK。开发者经济分析公司 SlashData 曾发布了《 2018 年第 2 季度各国开发者状况》调查报告,共有 167 个国家的 20500 多名开发者参与其中。报告面向全球所有类型的程序员,对使用每种主要编程语言的活跃开发者数量进行了最新的估计。其中,JavaScript 仍是最流行的编程语言,Python 流行程度接近 Java。 哪种语言最难学呢?每个人也许都有着自己的想法,衡量标准各不相同。现在我们从一个全新的,无可反驳的角度来分析一下各个编程语言难学程度。第十名、R语言颁奖词R语言,一种自由软件编...阅读全文
从自动化、功能、性能、压力、稳定性到兼容性测试,移动应用测试分门别类甚广,尽管测试对于大多数企业和开发者而言是非常头疼的事情,但许多公司在很多时候还是由开发者自测应用,更有甚者因资金等种种原因而没有测试,由此催生出众多第三方测试服务。 移动应用测试现状 谈到移动应用测试的现状,目前许多公司都是开发者自己负责应用测试,自测其实是很困难的一件事,有些公司还会由于资金以及其他原因没有测试,也有一些公司会采取招一大堆功能测试和Android测试人员的手段,但大部分并没有特别地成熟、完善,很难通过单点测试或自动化测试来覆盖整体功能,总体而言还是比较费劲。于是,便有许多创业公司试图在这方面深耕以求解决痛点。 现在对于移动应用测试而言,即使配备了测试团队,也可能不会发现太多问题,...阅读全文
封装成函数: //选出第k小元素,k为1~len(s) func SelectKthMin(s []int, k int) int { k-- lo, hi := 0, len(s)-1 for { j := partition(s, lo, hi) if j < k { lo = j + 1 } else if j > k { hi = j - 1 } else { return s[k] } } } //选出中位数(比一半的元素小,比另一半的大) func SelectMid(s []int) int { return SelectKthMin(s, len(s)/2) } //选出k个最小元素,k为1~len(s) func SelectKMin(s []int, k int) []i...阅读全文
golang 切片扩容的探讨 分以下几种情况: 1.切片每次新增个数不超过原来的1倍,且每次增加数不超过1024个,且增加后总长度小于1024个,这种情况下扩容后为原来的2倍 s1 := make([]int, 0) fmt.Printf("The capacity of s1: %d\n", cap(s1)) for i := 1; i <= 17; i++ { s1 = append(s1, i) fmt.Printf("s1(%d): len: %d, cap: %d\n", i, len(s1), cap(s1)) } fmt.Println() 结果: /* The capacity of s1: 0 s1(1): len: 1, cap: 1 s1(2): len: 2, cap...阅读全文
排序算法是接触最多也是考察最多的一个知识点,最常用的:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。其中可以按照时间复杂度把冒泡和插入归并为O(n^2)一类,归并和快排归并为O(n*log(n))一类,后三者归为O(n)一类。 分析排序算法主要从执行效率、内存消耗和稳定性三个角度去衡量,执行效率就是常说的时间复杂度,内存消耗主要说的是空间复杂度,这里还引入了一个原地排序概念(就是特指空间复杂度是 O(1) 的排序算法,可以理解为就在原内存空间上做数值交换),稳定性则是考虑待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。 一、冒泡or插入 1.冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否...阅读全文
> 由于之前在golang中文社区没有查到radix-sort让我尴尬,就自己给出如下代码,如果不足也请大家指明 ```go import "strconv" func RadixSort(arr []int) []int{ if len(arr)<2{ fmt.Println("NO NEED TO SORT") return arr } maxl:=MaxLen(arr) return RadixCore(arr,0,maxl) } func RadixCore(arr []int,digit,maxl int) []int{ //核心排序机制时间复杂度 O( d( r+n ) ) if digit>=maxl{ return arr //排序稳定 } radix:=10 count:=...阅读全文
package main import ( "fmt" ) func QuickSort(src []int, first, last int) { flag := first left := first right := last if first >= last { return } for first < last { //从最右边开始向前找比选取的标记值小的数字,然后进行交换,并记下标记值的新index for first < last { if src[last] >= src[flag] { last -= 1 continue } else { tmp := src[last] src[last] = src[flag] src[flag] = tmp flag = last ...阅读全文
《Go语言四十二章经》第三十二章 fmt包 作者:李骁 ## 32.1 fmt包格式化I/O 上一章我们有提到fmt格式化I/O,这一章我们就详细来说说。在fmt包,有关格式化输入输出的方法就两大类:Scan 和 Print ,分别在scan.go 和 print.go 文件中。 print.go文件中定义了如下函数: ```go func Printf(format string, a ...interface{}) (n int, err error) func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) func Sprintf(format string, a ...interfac...阅读全文
动态规划 暴力法(多次遍历) func maxProfit(prices []int) int { maxprofit:=0 for i:=0;i
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array. Example: For num = 5 you should return [0,1,1,2,1,2]. Follow up: It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time...阅读全文
MySQL 事务主要用于处理操作量大,复杂度高的数据。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务用来管理 insert,update,delete 语句,事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 本文主要介绍golang实现MySQL数据库事物的提交与回滚。用到的库有: "github.com/jmoiron/sqlx" _ "github.com/go-sql-driver/mysql" 事务(Tra...阅读全文
The game of Go has long been viewed as the most challenging of classic games for artificial intelligence owing to its enormous search space and the difficulty of evaluating board positions and moves. Here we introduce a new approach to computer Go that uses ‘value networks’ to evaluate board positions and ‘policy networks’ to select moves. These de...阅读全文
字符串反转 问题描述:给定一个字符串,将若干个字符移动到该字符串尾部 例:1234abc将前四个字符移动到尾部,输出abc1234 思路 蛮力法,移动 时间复杂度高 分部拷贝,交换 空间复杂度高 三步翻转 时间复杂度O(n) 空间复杂度O(1) golang代码如下:(三步反转) //三步翻转 func stringRevote(start, end int, str []byte) { if start < 0 || end > len(str)-1 { log.Fatal("起始位置或终止位置错误") } //golang中切片是传址 for start < end { //第一个跟最后一个换 str[start], str[end] = str[end], str[start] //起...阅读全文