摘要:1. 切片slice的声明和初始化 , 如果只是单纯的声明 var list []string , 那么list现在是nil , 转换成json会变成null 2. 声明后使用了append函数增加了数据 , 那么就是正常的列表了 var list []string list=append(list 阅读全文
posted @ 2020-11-24 19:08 陶士涵 阅读(8) 评论(0) 推荐(0) 编辑
摘要:使用append函数的时候 , 要把扩展后的新slice重新赋值给原变量名 , 因为当底层数组的空间不足的时候 , 会扩充内存空间 ,内存空间会重新分配 通常我们并不知道append调用是否导致了内存的重新分配,因此我们也不能确认新的slice和原始的slice是否引用的是相同的底层数组空间。同样, 阅读全文
posted @ 2020-11-24 19:01 陶士涵 阅读(12) 评论(0) 推荐(0) 编辑
摘要:单例模式: 懒汉式和饿汉式 , 只有一个实例 原型模式: clone出来的 简单工厂: 具体工厂生产具体产品 工厂方法: 抽象工厂,具体工厂,抽象产品,具体产品 一个工厂生产一种产品 抽象工厂: 抽象工厂,具体工厂,抽象产品,具体产品 一个工厂生产多种产品,抽象工厂里面定义多个抽象方法让具体工厂实现 阅读全文
posted @ 2020-11-24 17:44 陶士涵 阅读(7) 评论(0) 推荐(0) 编辑
摘要:开闭原则:对扩展开放,对修改关闭 里式替换原则:继承时尽量不要修改父类方法 依赖倒置原则:面向接口编程 单一职责:一个类尽量是单一功能 接口隔离:一个接口尽量是单一的功能 迪米特原则:最少知识法则,尽量少发生直接调用 合成复用原则:采用组合和聚合的方式代替继承 阅读全文
posted @ 2020-11-24 17:36 陶士涵 阅读(6) 评论(0) 推荐(0) 编辑
摘要:在jwt-go里存储一个map[string]interface{} 比如 info["id"]=10 解析出来的时候 info["id"]断言的时候 , 应该用float64断言 , info["id"].(float64) 然后再去强转 Go语言提供了两种精度的浮点数,float32和float 阅读全文
posted @ 2020-11-23 16:58 陶士涵 阅读(11) 评论(0) 推荐(0) 编辑
摘要:先来看一下概念: 一个类型声明语句创建了一个新的类型名称,和现有类型具有相同的底层结构。 type 类型名字 底层类型 gin框架中的实例: type H map[string]interface{} 类型声明语句一般出现在包一级,因此如果新创建的类型名字的首字符大写,则在包外部也可以使用。 上面的 阅读全文
posted @ 2020-11-21 11:39 陶士涵 阅读(16) 评论(0) 推荐(0) 编辑
摘要:TIMESTAMP在MySQL5.5中的行为: 1.第一个未设置默认值的TIMESTAMP NOT NULL字段隐式默认值:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 2.后面未设置默认值的TIMESTAMP NOT NULL字段隐式默认值:0000- 阅读全文
posted @ 2020-11-20 11:14 陶士涵 阅读(26) 评论(0) 推荐(0) 编辑
摘要:gofly客服websocket部分存在groutine泄露 , 在每次连接ws的时候都开启了groutine , 但是没有关闭 pprof是go标准库自带的功能 , 引进去就能分析程序中的性能问题 , 在gin框架下可以使用第三方的"github.com/gin-contrib/pprof" en 阅读全文
posted @ 2020-11-19 19:18 陶士涵 阅读(24) 评论(0) 推荐(0) 编辑
摘要:使用delete删除数据 , 是我们常用的用法 , 但是这样并没有真正的把数据删除掉 , mysql只是标志了一下删除 测试如下, audit_log表删除之前的数据文件的大小 [root@dev-3-144 shihan1]# ll /data2/mysql3960/sinanet/|grep a 阅读全文
posted @ 2020-11-19 16:30 陶士涵 阅读(21) 评论(0) 推荐(0) 编辑
摘要:在排查所有查询语句效率的过程中 , 发现了join关联表的时候 , 被驱动表没有走索引而是进行的全表扫描 实际的sql语句如下: explain select a.* from audit_rules a left join audit_rules_detail b on a.id=b.rule_i 阅读全文
posted @ 2020-11-19 15:33 陶士涵 阅读(33) 评论(0) 推荐(0) 编辑
摘要:婚假回来了,第一件事先打个测试机代码的压缩包,可能别的同事有ftp提交过代码 打压缩包zip -q -r test.zip /home/test-q是不显示指令详情-r是递归所有文件文件夹 在压缩包里删除指定的文件zip -dv test.zip a.txt-d是删除-v是显示指令的详情 其他参数: 阅读全文
posted @ 2020-11-19 13:45 陶士涵 阅读(41) 评论(0) 推荐(0) 编辑
摘要:后台用户登录验证功能是很多项目的必须要有的逻辑 , 也是常见的技术需求 . 要实现这个逻辑首先要有数据库表结构如下: CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEF 阅读全文
posted @ 2020-10-26 18:59 陶士涵 阅读(110) 评论(0) 推荐(0) 编辑
摘要:使用类型断言断定某个接口是否是指定的类型 if这种简化形式:if _,ok:=x.(T);ok{ } type-switch 类型判断形式 switch t := x.(type) { case int: fmt.Printf(1) case nil: fmt.Printf(2) default: 阅读全文
posted @ 2020-10-26 11:29 陶士涵 阅读(37) 评论(0) 推荐(0) 编辑
摘要:有一个需求是获取指定用户发送的最新的内容 , 这个时候需要使用group by分组功能 但是怎么获取最新的呢 ? 如果直接进行order by 是不能实现的 , 因为mysql会先执行group by 后执行order by 因此需要进行子查询 selelct * from (子查询) xxx gr 阅读全文
posted @ 2020-10-22 11:19 陶士涵 阅读(124) 评论(0) 推荐(0) 编辑
摘要:在gin框架下使用websocket , 如果是跨域请求的时候会报这个错误 request origin not allowed by Upgrader.CheckOrigin 使用的websocket库是 "github.com/gorilla/websocket" 需要增加以下代码: upgra 阅读全文
posted @ 2020-10-21 22:08 陶士涵 阅读(69) 评论(0) 推荐(0) 编辑
摘要:那是12年左右,我还在上大学,就经常自己开发自己的个人主页。最早的时候使用的是纯静态的DIV+CSS页面,后来增加了连接数据库的功能,当时还是使用的ASP语言+Access的数据库。做完以后就想要找一个空间把我的个人主页放上去,好通过域名让别人访问 在网上找来找去,发现了3v空间,那时候这个主机空间 阅读全文
posted @ 2020-10-20 22:00 陶士涵 阅读(42) 评论(0) 推荐(0) 编辑
摘要:最普通的一个应用就是获取网络的列表数据,然后把数据循环渲染到list列表组件上 js部分的代码是,获取网络并设置data Page({ data: { baseUrl:"https://gofly.sopans.com", visitors:[] }, login(){ my.alert({ tit 阅读全文
posted @ 2020-10-20 21:28 陶士涵 阅读(68) 评论(0) 推荐(0) 编辑
摘要:第一次使用支付宝小程序,文档也没怎么细看直接就搞,报了这么个错。 这是因为当使用ui组件时 , 没有在json文件里声明 例如我的json文件 { "defaultTitle": "GO-FLY在线访客", "usingComponents":{ "list": "mini-ali-ui/es/li 阅读全文
posted @ 2020-10-20 21:20 陶士涵 阅读(78) 评论(0) 推荐(0) 编辑
摘要:使用gin gorm时 , 默认sql语句是打印在终端的 ,想要记录到文件中 , 可以使用logrus来记录到文件 先把logrus的一些配置做好 package tools import ( "fmt" "github.com/gin-gonic/gin" "github.com/sirupsen 阅读全文
posted @ 2020-10-20 14:20 陶士涵 阅读(113) 评论(0) 推荐(1) 编辑
摘要:当本地进行了commit操作 , 但是还没有push到远端的时候 , 这个时候pull是不能覆盖掉新commit的文件 需要先本地回退到上一个或指定版本后 , 再撤销掉暂存区代码 使用tortoiseGit的可视化操作更加直观 点击显示日志后 , 选中某一次提交的日志 ,重置到此 硬重置就是直接把代 阅读全文
posted @ 2020-10-20 11:15 陶士涵 阅读(77) 评论(0) 推荐(0) 编辑
摘要:外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。符合迪米特原则 如果我想使用多个类的代码,先创建个门面 阅读全文
posted @ 2020-10-19 14:02 陶士涵 阅读(53) 评论(0) 推荐(0) 编辑
摘要:动态地为类的实例添加功能,一层一层的套功能 先定义好接口 interface Booking{ public function getDescription(): string; } 这个就是装饰器实现了Booking,通过构造函数传递Booking对象进来 abstract class Booki 阅读全文
posted @ 2020-10-18 19:04 陶士涵 阅读(44) 评论(0) 推荐(0) 编辑
摘要:如果函数的最后一个参数是采用 ...type 的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为 0,这样的函数称为变参函数。 示例函数和调用: func myFunc(a, b, arg ...int) {} func Greeting(prefix string, who ...str 阅读全文
posted @ 2020-10-16 14:54 陶士涵 阅读(44) 评论(0) 推荐(0) 编辑
摘要:数据映射器是一个数据访问层,用于将数据在持久性数据存储(通常是一个关系数据库)和内存中的数据表示(领域层)之间进行相互转换。其目的是为了将数据的内存表示、持久存储、数据访问进行分离。该层由一个或者多个映射器组成(或者数据访问对象),并且进行数据的转换。映射器的实现在范围上有所不同。通用映射器将处理许 阅读全文
posted @ 2020-10-15 14:40 陶士涵 阅读(48) 评论(0) 推荐(0) 编辑
摘要:在一些客服系统中,当有新消息出现时,会有提示声音响,使用到的是html5的新标签 <audio id="chatMessageAudio"> <source id="chatMessageAudioSource" src="/static/images/alert.mp3" type="audio/ 阅读全文
posted @ 2020-10-15 13:57 陶士涵 阅读(27) 评论(0) 推荐(0) 编辑
摘要:以单个对象的方式来对待一组对象 有一个接口类,有一个需实现的方法,其他所有类都实现它,在一个组合类的实现方法中循环调用另外其他类的方法 有一个公共的接口类 interface Renderable { public function render(): string; } 组合类,也实现了接口 cl 阅读全文
posted @ 2020-10-15 11:50 陶士涵 阅读(41) 评论(0) 推荐(0) 编辑
摘要:解耦一个对象的实现与抽象,这样两者可以独立地变化。对一个功能进行拆分成两个具体对象,通过构造函数或者方法传递桥接起来两个对象 通过传递另外对象来实现功能,本身保留抽象方法给子类去独立实现 abstract class Service { protected Formatter $implementa 阅读全文
posted @ 2020-10-14 19:12 陶士涵 阅读(23) 评论(0) 推荐(0) 编辑
摘要:在项目中使用到了curl扩展进行PUT传递数据到另一个接口,但是看到的现象是有时候偶发数据是空的 . 这个时候就使用了tcpdump命令来查看连接情况 具体命令是下面 , 另一个接口的端口号是8025 : tcpdump -i any port 8025 -l -s 0 可以看到在我请求对方时出现下 阅读全文
posted @ 2020-10-14 17:26 陶士涵 阅读(39) 评论(0) 推荐(0) 编辑
摘要:SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DATA数据传输, RST表示连接重置 F : FIN - 结束; 结束会话 S : SYN - 同步; 表示开始会话请求 R : RST - 复位;中断一个连接 P : PUSH - 推送; 数据包立即发送 A : ACK 阅读全文
posted @ 2020-10-14 17:16 陶士涵 阅读(132) 评论(0) 推荐(0) 编辑
摘要:CURLOPT_CONNECTTIMEOUT 连接超时 用来告诉PHP脚本在成功连接服务器前等待多久(连接成功之后就会开始缓冲输出),这个参数是为了应对目标服务器的过载,下线,或者崩溃等可能状况; CURLOPT_TIMEOUT 传输超时 用来告诉成功PHP脚本,从服务器接收缓冲完成前需要等待多长时 阅读全文
posted @ 2020-10-14 17:12 陶士涵 阅读(31) 评论(0) 推荐(0) 编辑
摘要:将某个类的接口转换成与另一个接口兼容。适配器通过将原始接口进行转换,给用户提供一个兼容接口,使得原来因为接口不同而无法一起使用的类可以得到兼容。 下面这个例子Book 和EBook这是两个类型,方法都不一样,通过一个EBookAdapter类转换EBook方法成为Book的方法 两个类型的接口 in 阅读全文
posted @ 2020-10-13 18:59 陶士涵 阅读(24) 评论(0) 推荐(0) 编辑
摘要:和抽象工厂类似,静态工厂模式用来创建一系列互相关联或依赖的对象和抽象工厂模式不同的是静态工厂模式只用一个静态方法就解决了所有类型的对象创建 工厂里提供一个静态方法来创建不同的对象实例 final class StaticFactory { public static function factory 阅读全文
posted @ 2020-10-13 18:48 陶士涵 阅读(21) 评论(0) 推荐(0) 编辑
摘要:使应用中只存在一个对象的实例,并且使这个单实例负责所有对该对象的调用 final class Singleton{ private static ?Singleton $instance = null; public static function getInstance(): Singleton 阅读全文
posted @ 2020-10-13 18:42 陶士涵 阅读(27) 评论(0) 推荐(0) 编辑
摘要:简单的创建对象型工厂模式,目的是当有很多的初始化动作的时候,可以直接在工厂里搞,不用每次new都写一遍 工厂生成自行车 class SimpleFactory { public function createBicycle(): Bicycle { return new Bicycle(); } } 阅读全文
posted @ 2020-10-13 17:47 陶士涵 阅读(26) 评论(0) 推荐(0) 编辑
摘要:通过创建一个原型对象,然后复制原型对象来避免通过标准的方式创建大量的对象产生的开销(new Foo())。 大量的数据对象(比如通过ORM获取1,000,000行数据库记录然后创建每一条记录对应的对象实体)带构造方法、属性的类,clone的性能要比new带上构造参数的性能高不少 这个就是原型,子类继 阅读全文
posted @ 2020-10-13 17:34 陶士涵 阅读(22) 评论(0) 推荐(0) 编辑
摘要:最重要的特征是,有两个数组存对象,忙的数组和闲的数组.当使用对象后,不是立即销毁对象,而是放回池子闲的数组里面,下次使用直接拿,拿到后放到忙的数组里.当拿不到的时候就再创建新 class WorkerPool { /** * @var 忙的数组 */ private array $occupiedW 阅读全文
posted @ 2020-10-13 16:43 陶士涵 阅读(39) 评论(0) 推荐(0) 编辑
摘要:简化就是工厂生成产品,工厂和产品都是接口,分别都有对应的具体实现类 工厂方法和抽象工厂的样子非常的像,只有一点小区别,工厂方法处理一个产品族,抽象工厂处理多个产品族,一个处理的产品少一个处理的多。 有一个工厂接口LoggerFactory , 日志器工厂 有两个工厂的实现类,标准输出日志器工厂 和 阅读全文
posted @ 2020-10-13 16:28 陶士涵 阅读(24) 评论(0) 推荐(0) 编辑
摘要:目的:生成器的目的是将复杂对象的创建过程(流程)进行抽象,生成器表现为接口的形式。 如果对象有复杂的继承树,理论上创建对象的生成器也同样具有复杂的继承树。 传进来一个生成器, 我调用这个生成器来生成我所需要的汽车,这就是生成器模式的核心.这个生成器Builder是个接口,把复杂对象的创建过程进行抽象 阅读全文
posted @ 2020-10-13 15:59 陶士涵 阅读(27) 评论(0) 推荐(0) 编辑
摘要:支付宝小程序的开发管理里 > 服务器域名白名单添加 自己的主域名 , 所有二级域不需要都加上 js文件里直接使用网络API my.request({ url: 'https://gofly.sopans.com/visitors_online', method: 'GET', success: fu 阅读全文
posted @ 2020-10-13 14:26 陶士涵 阅读(35) 评论(0) 推荐(0) 编辑
摘要:抽象工厂:在不指定具体类的情况下创建一系列相关或从属对象。最重要的特征就是抽象类的组合.通常,创建的类都实现相同的接口。抽象工厂的客户端并不关心这些对象的创建方式,只是知道它们如何组合在一起。 三个抽象类 interface WriterFactory{ public function create 阅读全文
posted @ 2020-10-13 13:24 陶士涵 阅读(25) 评论(0) 推荐(0) 编辑