rune是Go语言中一种特殊的数据类型,它是int32的别名,几乎在所有方面等同于int32,用于区分字符值和整数值,官方解释如下:
创新互联专业为企业提供蒙山网站建设、蒙山做网站、蒙山网站设计、蒙山网站制作等企业网站建设、网页设计与制作、蒙山企业网站模板建站服务,10年蒙山做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
下面我们通过一个例子来看一下:
我们猜测一下结果,hello5 个字符+1 个空格+3 个汉子,算起来应该是 9 个,长度为 9 才对,但是我们执行一下,
结果打印是 15,这是为什么呢?
所以计算出的长度就等于 5+1+3*3=15
如果我们需要计算出字符串的长度,而不是底层字节的个数,那么可以使用下面的方法:
运行结果如下:
在 rune 定义上方还有一个,byte = uint8
在写sql语句时,where的条件主要是 key=1 and key2=2 或者 key=1 or key2=2 这种形式[还有 and与or 混合]。
认真分析会发现条件有 4部分 组成-- 字段名、操作符、查询值、与前一个条件的关系[and,or] ,这样就很容易实现了。下面就是一个说明,为了简化,其中会默认省略一些特征。
启动项目
访问测试地址:
带分页的地址:
1. 保留但大幅度简化指针
Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。
2. 多参数返回
还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在Go里面这是完全不必要的。而且多参数的支持让Go无需使用繁琐的exceptions体系,一个函数可以返回期待的返回值加上error,调用函数后立刻处理错误信息,清晰明了。
3. Array,slice,map等内置基本数据结构
如果你习惯了Python中简洁的list和dict操作,在Go语言中,你不会感到孤单。一切都是那么熟悉,而且更加高效。如果你是C++程序员,你会发现你又找到了STL的vector 和 map这对朋友。
4. Interface
Go语言最让人赞叹不易的特性,就是interface的设计。任何数据结构,只要实现了interface所定义的函数,自动就implement了这个interface,没有像Java那样冗长的class申明,提供了灵活太多的设计度和OO抽象度,让你的代码也非常干净。千万不要以为你习惯了Java那种一条一条加implements的方式,感觉还行,等接口的设计越来越复杂的时候,无数Bug正在后面等着你。
同时,正因为如此,Go语言的interface可以用来表示任何generic的东西,比如一个空的interface,可以是string可以是int,可以是任何数据类型,因为这些数据类型都不需要实现任何函数,自然就满足空interface的定义了。加上Go语言的type assertion,可以提供一般动态语言才有的duck typing特性, 而仍然能在compile中捕捉明显的错误。
5. OO
Go语言本质上不是面向对象语言,它还是过程化的。但是,在Go语言中, 你可以很轻易的做大部分你在别的OO语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO在Go语言中,就是普通的struct操作。
6. Goroutine
这个几乎算是Go语言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,这玩意是超级轻量级的类似线程的东西,但通过它,你不需要复杂的线程操作锁操作,不需要care调度,就能玩转基本的并行程序。在Go语言里,触发一个routine和erlang spawn一样简单。基本上要掌握Go语言,以Goroutine和channel为核心的内存模型是必须要懂的。不过请放心,真的非常简单。
7. 更多现代的特性
和C比较,Go语言完全就是一门现代化语言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language类似), function是first class object,等等等等。
看到这里,你可能会发现,我用了很多轻易,简单,快速之类的形容词来形容Go语言的特点。我想说的是,一点都不夸张,连Go语言的入门学习到提高,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Go语言,从入门到能够上手做项目,最多不过半个月。Go语言给人的感觉就是太直接了,什么都直接,读源代码直接,写自己的代码也直接。
部署简单。Go编译生成的是一个静态可执行文件,除了glibc外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。这和Python有着巨大的区别。由于历史的原因,Python的部署工具生态相当混乱【比如setuptools,distutils,pip,
buildout的不同适用场合以及兼容性问题】。官方PyPI源又经常出问题,需要搭建私有镜像,而维护这个镜像又要花费不少时间和精力。
并发性好。Goroutine和channel使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个Go应用也能有效的利用多个CPU核,并行执行的性能好。这和Python也是天壤之比。多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁GIL的原因,多线程的Python程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的multiprocessing包又会对监控和管理造成不少的挑战【我们用的supervisor管理进程,对fork支持不好】。部署Python应用的时候通常是每个CPU核部署一个应用,这会造成不少资源的浪费,比如假设某个Python应用启动后需要占用100MB内存,而服务器有32个CPU核,那么留一个核给系统、运行31个应用副本就要浪费3GB的内存资源。
良好的语言设计。从学术的角度讲Go语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是Go自带完善的工具链,大大提高了团队协作的一致性。比如gofmt自动排版Go代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有gofix,
govet等非常有用的工具。
执行性能好。虽然不如C和Java,但通常比原生Python应用还是高一个数量级的,适合编写一些瓶颈业务。内存占用也非常省。
ORM-Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库
它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了
GORM就是go语言实现的一个ORM库
特点:
增加(Create)
检索(Retrieve)
更新(Update)
删除(Delete)
如果模型中有 DeletedAt 字段,它将自动拥有软删除的能力!当执行删除操作时,数据并不会永久的从数据库中删除,而是将 DeletedAt 的值更新为当前时间。
具体的使用可查看gorm 官方文档
在项目中我们定义一个全局的GVA_DB,方便使用时调用
后续我们在需要查询数据库时便可直接通过global.GVA_DB使用
比如创建商品信息:
我们先通过查询分类是否存在,然后再创建商品
通过gorm的链式操作可以很方便的进行crud操作
分页查询是项目中经常使用到的功能,当指定条件查询的数据量过大时,如果我们将数据一次性返回,会对数据库造成较大的负荷,同时降低接口的性能,通常我们会使用分页查询的方式让数据进行分段展示,从而保障接口的性能。在gorm中我们实用Offset,和Count来实现分页
我们通过前端的传递过来的分页数据进行查询
该商城作为gin的学习项目,没有很复杂的逻辑,所有业务逻辑均通过Mysql实现。包括后面将要介绍的登录态,也是如此。
所有代码已上传github,有兴趣的可以访问,如果有更好的建议也欢迎提交issure,pr
同样是高中,写了一个邮箱爆破工具,把班上一个女生的邮箱破解了,看了她写在邮箱里的日记,原来她不喜欢我。那个时候我知道了,技术可以揭示真相,但改变不了人心。
上大学的时候每学期期末都要在教务系统评价老师,虽然没有任何卵用,但是它还居然不能同时填写一个,也就是说,你不能全部填A,也不能全部填B或者C或者D,这很麻烦,所以我做了一个插件,点一下就完事儿,随机填写,保证能提交成功,获得了全校同学的喜爱。
大二的时候渗透了学校图书馆的服务器,在里面植入了我的木马,可以任意借书,只要检测到我的名字,就直接删除借出信息,于是我借的一本普林斯顿高等数学就在寝室躺了三年,不过我也只借了这一本。
社交网络这部电影火起来的时候,我也抓了全校学生的照片,做了个类似facemash的网站,后来被辅导员发现了,就关停了。
后来搞到一个树莓派,更是做了许多好玩的东西,比如接上扬声器和话筒,用百度语音识别接口和图灵机器人的接口实现了一个语音助手,我只要在客厅问他,今天天气怎么样,他就会回答天气如何,而且我还加了定时任务在里面,每隔一段时间,会发微博@我的女朋友注意喝水
先不回答问题,先聊聊这个听说!
程序员并不是疯子,只是逻辑思维可能比较的接近于计算机思维,所以常常有些顽固。
成天和代码打交道不假,不过,交流也是程序员比较重要的一个能力,所以沟通能力还是比较强的,只是说,做技术的人都有个通病,就是,不感兴趣的话题,我不插嘴。
so,有本事和程序员聊数码产品,你看看他话多还是少。
最后一个,很难找对象。
这个其实是一个误区,我认识的30+单身的妹纸,绝对比30+单身的程序员多非常多。but,这些30+单身的程序员,基本都看不上这些30+单身的妹子。
所以,程序员找不到对象只是一种假象。
好了,说说我写得最牛的一个程序吧。
很早很早以前,我们做了一个应用程序商城,当时还不是移动互联网时代,智能手机才刚刚问世,所以,我们的应用程序商城卖的是SaaS系统。
我们有非常非常多的SaaS系统提供商,包括Microsoft、Google等等。
所有的这些SaaS系统,我们这里卖的都是license,license也分等级,例如高级用户,中级用户,初级用户。
每个SaaS系统也有不同的通讯协议和报文格式。
因为我们要对接的SaaS系统非常多,我们不可能去每个系统单独对接,所以,我们就自己做了一个模块,能够将所有的通讯内容进行配置。并且,这些配置都是可视化的。
用户在根据我们的配置,进行不同的选择,然后付费,我们在将这些内容传递给SaaS系统。
but,这个并不算是复杂的。
这些SaaS软件的提供商都是老大,他们需要能够知道并且测试自己的系统在我们商城下运行是否顺畅,并且他们可能会调整自己的一些配置,也需要知道这些调整会不会有影响。
因此,我们就做了一套系统,这套系统可以根据这些SaaS软件提供商基于自己的系统接口的配置基础上再进行配置,然后按照这些配置自动的一步步执行,如果执行不下去了,将结果告诉SaaS软件提供商,并且告知他是什么问题引起的。
例如: SaaS软件提供商想模拟一个企业用户购买了1个高级用户License,再购买了3个普通用户license,然后将其中2个普通用户license升级为高级用户,然后将1个高级用户license降级为普通用户,然后,将1高级用户license分配给了员工A,1个普通用户license分配给了员工B,然后注销掉所有的普通用户license。
当然,这个流程可以非常长非常长,而且其实内部规则很多,例如,有的SaaS系统可能是,注销普通license后,如果有空闲的高级license,普通license所分配的用户需要自动分配到高级license上,但有的SaaS确是,注销后,用户需要闲置。
所以,当时这个配置化的通信模块,并且还含有规则的功能就已经很复杂了,还要在此基础上做一个自动化的测试系统,基本上我们都快做哭了。
你自己测试自己的接口,能不能自己写脚本,懒到爆了。
我觉得自己最牛X的程序是高中时在学习机上用6502汇编语言写的钢琴程序。
当时的裕兴学习机带一种学习卡,可以使用汇编写程序,买到了一本薄薄的汇编语言指令书籍,对照一些《电子报》的零星资料,自己学习了解学习机的地址划分、指令集。
当时为了搞明白程序干啥用的,搞白纸从屏幕(电视机)抄了很多反汇编代码。那台学习机的内存1M,还使用了内存分页,有限的资料要搞明白内存是怎么划分的,真是耗了很多脑细胞。最要命的是写程序不带存储功能,每次要写就要重新输入一遍程序。后来又学它的手柄控制、Midi音乐、键盘控制、软驱控制,但那时候这些东西对自己来说太难了,有的能搞出来,有的没成功。
最后还是用它的汇编写了个电子琴程序。
学习卡另外还自带G-Basic的情况下,用basic实现更容易,我也是先学Basic后学的汇编。现在自己也一度觉得,那时候自己是一生中自学能力的巅峰,可惜了当时学习资料太少,长大了学习能力急剧下滑,到现在也没啥出息。
不要妖魔化程序员,程序员只是一个职业身份。黑客是程序员的一种,所谓的黑客其实也是写代码而已,只是因为代码有特别的功能,就像黑匣子那样神秘,所以才会被称为黑客吧。怎么样神秘,其实我也不知道,但是可以肯定的是,无非就是在现有系统和代码的前提下,利用Bug而实现其特殊功能而已。
不鼓励程序员写所谓的黑程序,大多数场合一点价值都没有,甚至还可能违法违规。实际上,网络安全已经很发达,你能看到的所谓的漏洞,很可能是请君入瓮。
程序员的确要花很多时间和代码打交道,但是除了代码,还有很多人和事。比如产品经理、项目经理、设计与美工、架构与系统、项目组其他成员同事。如果你是从事和硬件相关的软件开发,那么你还需要和硬件以及硬件团队打交道。所以,成天只和代码打交道,基本上不是什么现实情况。
程序员干得久,普遍来说确实要比干销售之类的要沉默内向一些,或者说有些木讷吧。我认为主要是工作环境影响的吧,大部分时间其实还是与代码打交道,构思,编写,调试,修改,验证。
程序员其实还是很好找女朋友的哦,主要是给人实诚可靠的感觉。再加上,程序员普遍的工资都不算低,如果是一线城市,二十万年薪起步的大有人在,三十万年薪起步的也不少,五十万年薪以上的就相对少一点。如果是大厂的程序员,五十万年薪起步其实并不算多。
疯子通常和天才是近义词,所谓的疯子不是医学上的疯子,是看起来和常人不一样,思维和行动可能也会有差异。但大多数程序员都不是疯子,因为大多数程序员都不是天才。天才不是疯子,疯子更不是天才,只是他们之间有一些交叉特点,就是与常人不太一样。
最后,还是正面回答一下题主的问题。我没有写过黑客般的程序,也没有写过很牛X的程序。我觉得我写的比较好的那些程序,是框架好,稳定性好,扩展性好。我有很多代码,从写好之后,纵横多个平台,历经十几年的考验,经历了很多量产项目的洗礼,我想这就是好代码之一吧。
我对这些不懂,但是,给我记忆最深刻的。就是一个写冒险岛外挂的一个人,那个外挂名字叫香飘飘,好像是写到079?还是哪个版本。然后就不写了。然后他本人说不写外挂的原因是!!!要去上高中了,要认真读书了,然后就不写了!
我先回答找不到对象这个问题,这一定是个初级程序员,我认识的程序员比我大的只有一个单身,结婚比例超过百分之九十九,所以说程序员找不到对象这个结论不知道是谁发明的。
另外我些过最牛X的程序是一个bug,当天公司的交易额降低到零…
比较满意的,是我自己在维护着的黑帽seo工具。
我做黑帽seo也有七八年了,对搜索引擎的算法了解得非常深刻,百度搜狗各种接口,快排,反推,强引,寄生虫……都是第一时间掌握。几万个站点经验,加上我个人见解的seo技巧,用php迭代了4个版本,维护着的一个全自动排名的seo工具。
目前开了一家跨境电商的公司,正利用它做谷歌。
牛逼之处那当然就是赚了不少的钱啦,其他说什么都是虚的。做这行这么久,早就褪去了各种技术标准,各种有的没的技术噱头的争论热情了。一个用dede采集搞的权5下载站,它也价值一两百万,吹技术是最无聊的事。
计划在四五月用go迭代到第五个版本,解决加密和性能的问题,一天几千万,上亿的蜘蛛量,php真的不行,之前想用swool的,看到他们团队的破事,就转向了go,额外说一句,go语言真好用。
不过目前也没有什么商业化的想法,所以就不要认为我在割韭菜了。纯粹是无聊,分享一下,吹吹牛逼。也不用找我引流,除非一个流量跳转能贵过3毛钱。