Go语言设计哲学——语言特性
Go 语言设计哲学第二弹,这不禁勾起了我的伤心往事,当时跟腾讯的面试官聊的多好啊,结果还是被挂了,呜呜呜……
面向对象在学过基础的 Go 语言语法后,我们就发现了 Go 和 C++ 最大的不同,那就是 Go 好像不支持面向对象。
这门编程语言里没有类(class)、继承(extends),难道真的不支持面向对象编程,难道它也知道我没有对象?完了,被监视了(狗头)。
你看,找工作给脑子找坏了吧。不必理会上面一段无脑发言,总结为玩原神玩的。那么 Go 到底支不支持面向对象,让我们一步一步地探寻。
类和继承类(class)在面向对象编程中是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的特性和方法(via @维基百科)。
继承是面向对象软件技术当中的一个概念,如果一个类别 B “继承自”另一个类别 A,就把这个 B 称为 “A的子类”,而把 A 称为 “B的父类别” 也可以称 “A 是 B 的超类”(via @维基百科)。
继承有如下两个特性:
子类具有父类别的各种属性和方法,不需要再次编写相同的代码。
子类别继承父类时,可以重新定义某些属性,并重写某些方法, ...
深入Go语言2——反射与unsafe
又到了一周一次的总结篇了,本周学到的知识可以用海量来表示了,毕竟这也是近一个月以来既没有考试也没有面试的一周,所以就一直在做项目、改简历。当然,较大模块的内容还是会在整理之后单独来记录。以后的事以后再聊,还是先来看看本周都学了什么吧。
反射在计算机科学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。(来自wikipedia)
反射是程序审查自身结构的能力,并能对程序做出一定的修改。
对于人来说,审查自身或过往事情的能力,叫 “反思” 或 “反省”。
Go 中的反射包:reflect介绍同 Java 语言一样,Go 语言也有运行时反射,这为我们提供了一种可以在运行时操作任意类型对象的能力。比如查看一个接口变量的具体类型、看看一个结构体又多少字段、修改某个字段的值等。
Go语言是静态编译类语言,比如在定义一个变量的时候,已经知道了它是什么类型,那么为什么还需要反射呢?这是因为有些事情只有在运行时才知道。比如你定义了一个函数,它有一个 interf ...
聊天室
这次真成全栈工程师了。第三个 Go 语言项目,简单地实现了一个基于 TCP 连接的聊天室。
实现功能也比较简单,用户输入昵称进入聊天室,进入聊天室后会向其他用户广播,用户可以看到聊天室的所有聊天记录和当前在线人数,支持@其他人,支持敏感词检测。
由于本项目也是基于书籍中的教程进行的开发,所以在此还是大概记录一下完成该项目学到的东西。
WebSocket本项目最重要的组成之一,本项目便是基于 WebSocket 进行开发的。
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,用于在 Web 应用程序中创建实时、双向的通信通道。
传统的 HTTP 请求通常是一次请求、一次相应,而 WebSocket 则可以建立一个持久连接,允许服务器即时向客户端推送数据,同时也可以接受客户端发送的数据。 WebSocket 相比于传统的轮询或长轮询方式,能够显著减少网络流量和延迟,提高数据传输的效率和速度。它对实时 Web 应用程序和在线游戏的开发非常有用。
WebSocket 可以在浏览器和服务器之间建立一条双向通信的通道,实现服务器主动向浏览器推送消息,而无需浏览器向服务器不 ...
Gohub——日志
正经人谁写日记啊?
欸欸欸,不好意思,来错片场了(手动狗头)。今天介绍的是项目中必不可少的一部分——日志。
日志系统虽然正经人不写日记,但是正经项目一定要记录日志。总所周知啊,Gohub 就是一个非常正经的项目,虽然还没有到企业级这么高的层次,但是也差不多了。
在 Gohub 中,我们使用日志来记录整个系统的运行情况,可能但不限于:
HTTP 请求数据
数据库 SQL 请求日志
Panic/Error 错误日志
请求第三方接口日志(发送短信、发送邮件等)
……
好了,是时候掏出祖传的几个问题了,什么是日志?该怎么设置日志?下面将会一一解答。
什么是日志日志系统是一种记录系统活动、事件或消息的工具或机制。在计算机领域,日志系统通常用于记录应用程序、操作系统或者其他软件系统的运行时信息。这些信息可以包括错误、警告、调试信息、用户操作记录等等。
日志系统的主要目的是帮助开发人员或管理员了解系统的状态和运行情况,以便进行故障排除、性能优化、安全审计等工作。通过分析日志,可以追踪问题的根源,监视系统的健康状况,并且可以在系统发生故障或异常时进行及时的响应和处理。
日志系统通常具有以下特点: ...
Gohub——注册
本文主要介绍新项目中第一部分的内容——身份验证接口的设计思路。
身份验证接口主要包括以下模块:
注册
登录
找回密码
基本流程为:
填写手机号或者邮箱
填写图片验证码中的内容
填写数字验证码以完成身份验证
操作完成
双重验证在调用接口时,用户需要完成图片验证码 + 短信验证码,我们在日常使用相关的功能时也是采用这样的双重验证的策略。那我们为什么要用这么繁琐的验证方式呢?在了解为什么之前,我们先来看以下这两种验证码的作用。
图片验证码 —— 区分机器人和正常用户
数字验证码——区分用户是否为手机号或邮箱的主人
采用双重验证,主要还是考虑到开放注册登录接口所带来的安全隐患。在知道了这两种验证码的作用后,我们来看缺少了其中一种会带来什么样的安全隐患。
黑客容易利用的地方,大致可以分为两部分:
滥用
暴力破解
滥用(轰炸机)删除图片验证,保留短信验证。
原理短信验证码轰炸一般基于web方式,主要有两个模块组成:一个前端web网页,提供输入被攻击者手机号码的输入窗口;一个后台攻击页面(如PHP),利用从各个网站上找到的动态短信URL 和前端输入的被攻击者手机号码,发送HTTP 请 ...
Gohub开发
本项目为从零构建一个高性能、功能齐全的 API 程序框架,主体内容和第一个项目相似。但是并没有做前端的内容,只针对相应功能做了 API 开发。
本项目主要设计一下三部分的知识点:
API 开发
命令行开发
构建高效率的程序结构
主要功能为:
用户的注册和登录
安全验证码和图片验证码
JWT 授权
用户修改个人信息
项目统计实现路由
请求方法
API 地址
说明
POST
/api/v1/auth/login/using-phone
短信 + 手机号登录
POST
/api/v1/auth/login/using-password
手机号、用户名、邮箱 + 密码
POST
/api/v1/auth/login/refresh-token
刷下 Token
POST
/api/v1/auth/password-reset/using-email
邮件密码重置
POST
/api/v1/auth/password-reset/using-phone
短信验证码密码重置
POST
/api/v1/auth/signup/using-phone
使用手机 ...
唉……
文章是越写越慢,质量是越来越差,这周的甚至连标题都想不出来了,离谱。从标题也能看出来,这周应该是不太愉悦的,二面被挂就算了,还被另一个面试官给戏耍了。我懂了,找实习就一个字——摆。
学习内容算法清明假期三天,每天都是两三个小时的做题时间,本周倒是没怎么做题。
原因是觉得刷了一个月的题了,还是在看到题目后几分钟就有思路了,但是不知道代码该怎么写,所以决定先沉淀几天。
项目虽然最近几天算法进展不怎么样,项目进展还是不错的。
上周六开的新项目,其实还是这周才开始,项目内容和之前的项目好像没有什么太大的区别,一个是博客,一个是论坛。但是实际开发就是天差地别了,不仅仅将框架全部换了 gin ,还用上了 redis。是的,就是那个只要出现在简历上就会触发面试官被动的 redis ,当然,以防万一,我非常认真地背了 Redis 三兄弟。
项目中更加详细地内容还是等到下周专门来写吧,写在周报里好像不是很好记录。
Go语言设计哲学没想到这一块竟然还有后续,因为上一篇有些一些相关的内容,后续也有去了解 Go 和 C++ 的不同,也查了一些资料,感觉很有意思,后续应该会继续写相关的内容。
找实习的进展有什么 ...
Go语言设计哲学
实在是想不到啊,我的博客里面竟然还会出现如此高大上的文章——设计哲学。为什么会想写关于这方面的文章呢,主要还是在跟面试官闲聊的时候提到了这方面的问题。面试还是能学到不少东西的嘛,毕竟我的眼界还是太窄了。
在学习一门语言时,有没有考虑过这个语言的语法和格式为什么要这么设计?这个问题一听就是一个好的话题啊,为什么这么设计?为什么在已经有了那么多语言后,还要设计出Go语言?
那么好,闲话少说,这周的主要内容就改为Go语言的设计哲学。当然,文章内容并不是我原创的,更多的还是网上查到的资料。
背景Go 编程语言构思于 2007 年底,构思的目的是:为了解决在 Google 开发软件基础设施时遇到的一些问题。
图中的三位大佬就是 Go 语言最初的设计者,从左到右依次为:
Robert Griesemer:参与过 Google V8 JavaScript 引擎和 Java HotSpot 虚拟机的研发。
Rob Pike:Unix 操作系统早期开发者之一,UTF-8 创始人之一,Go 语言吉祥物设计者是 Rob Pike 的媳妇。
Ken Thompson:图灵奖得主,Unix 操作系统早期开发 ...
操作数据库
目前为止,我们能接收到用户提交过来的数据,且对这些数据做验证。也已经开发完成验证错误的逻辑。那么这一节我们就要开始学习如何将数据存入数据库。
操作 MySQL 数据库在本项目中所选用的数据库为MySQL,使用GO操作MySQL等数据库,一般有两种方法:
一是利用 database/sql 接口,直接在代码里硬编码 sql 语句;
二是使用 ORM,具体一点是 GORM,以对象关系映射的方式在抽象地操作数据库。
database/sqldatabase/sql 包通过提供统一的编程接口,实现了对不同数据库驱动的抽象。
大致原理
Driver 接口定义:database/sql/driver 包中定义了一个 Driver 接口,该接口用于表示一个数据库驱动。驱动开发者需要实现该接口来提供与特定数据库的交互能力。
Driver 注册:驱动开发者需要在程序初始化阶段,通过调用 database/sql 包提供的 sql.Register() 方法将自己的驱动注册到 database/sql 中。这样,database/sql 就能够识别和使用该驱动。
数据库连接池管理:database/s ...
路由和中间件
本文主要用于介绍GoBlog项目中两个最为重要的部分——路由和中间件。这两个部分可以说是本项目的重要组成部分,下面我们会逐个进行学习和分析,并大概介绍其在项目中的作用。
路由goblog 需要一款灵活的路由器来搭配 MVC 程序结构,恰巧Go Web 开发有各式各样的路由器可供选择。这个时候可能就有朋友要问了,什么是路由啊,路由有什么用呢?额……其实我在学的时候也有这样的问题,那就慢慢往下看吧。
什么是路由?路由,就是URL地址到业务处理代码的映射。当用户输入一个URL地址时,服务器改知道要返回什么内容,一个 URL 到一个具体的处理函数之间的映射叫做一条路由。
多条路由组成路由表,路由表主要用于路由查找,根据不同的路由表的组织形式,可以有不同的查找方法。
给定一个URL,找到对应的处理函数的过程叫做路由查找。路由器就是用来管理路由表并进行路由查找的。
所以,在Web系统中一个路由系统由路由、路由表和路由匹配三部分功能组成。
路由实现由三种方法,分别是基于映射表、正则表达式以及tries结构的路由实现,下面将会一一介绍。
基于映射表的路由实现Go内建标准包bet/http中路由的 ...