Golang设计模式之装饰器模式

装饰器模式 GitHub代码链接 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。 什么是装饰器模式 装饰器模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整的前提下,提供了额外的功能。 解决了什么问题 一般的,我们为了拓展一个类经常使用继承的方式实现,由于继承类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。使用装饰器模式,可以不添加很多子类,实现类的拓展。 优点 装饰器类和被装饰类可以独立发展,不会互相耦合 缺点 多层装饰...阅读全文

简书 2020-10-03 00:32:38 ShawnLee_123

2020-10-02:golang如何写一个插件?

福哥答案2020-10-02:#福大大架构师每日一题# 简单回答: buildmode=plugin plugin.Open p.Lookup 中级回答: golang的plugin是使用-buildmode=plugin 的编译flag编译出的软件包,用于生成共享库(.so)库文件。 Go包中导出的函数和变量显示为ELF符号,可以在另一个golang程序中使用golang中的plugin包在运行时查找和绑定它们。 先写这样一段plugin代码: package main import "fmt...阅读全文

简书 2020-10-03 00:32:38 福大大架构师每日一题

为什么go中的receiver name不推荐使用this或者self

来自公众号:新世界杂货铺前言在日常的开发中我们除了定义函数以外, 我们还会定义一些方法。这本来没有什么, 但是一些从PHP或者其他面向对象语言转GO的同学往往会把receiver name命名为this, self, me等。笔者在实际项目开发中也遇到类似的同学, 屡次提醒却没有效果,于是决心写下这篇文章以便好好说服这些同学。CR标准做法首先我们来看一下GO推荐的标准命名Receiver Names,以下内容摘抄自https://github.com/golang/go/...:The name...阅读全文

Segmentfault 2020-10-07 11:32:32 新世界杂货铺

Go 每日一库之 air

简介air是 Go 语言的热加载工具,它可以监听文件或目录的变化,自动编译,重启程序。大大提高开发期的工作效率。快速使用本文代码使用 Go Modules,在 Mac 上运行。先创建目录并初始化:$ mkdir air && cd air $ go mod init github.com/darjun/go-daily-lib/air执行下面的命令安装air工具:$ go get -u github.com/cosmtrek/air上面的命令会在$GOPATH/bin目录下生成air命令。我一般...阅读全文

Segmentfault 2020-10-07 10:32:32 darjun

Golang并发模型之GMP

从进程谈起进程与线程的区别是什么?这是一个老生长谈的一道面试题。处于不同层面对该问题的理解也大不相同。对于用户层面来说,进程就是一块运行起来的程序,线程就是程序里的一些并发的功能。对于操作系统层面来说,标准回答是“进程是资源分配的最小单位,线程是cpu调度的最小单位”。接下来先从操作系统层面介绍一下进程与线程。进程在程序启动时,操作系统会给该程序分配一块内存空间,对于程序但看到的是一整块连续的内存空间,称为虚拟内存空间,落实到操作系统内核则是一块一块的内存碎片的东西。为的是节省内核空间,方便对内...阅读全文

Segmentfault 2020-10-06 19:32:33 郭朝

通过 Module proxy protocol 解决 Go 依赖包安装问

背景在 NAS 上搭建开发环境, 发现安装 vim-go 时, 一直有报错: request timeout, dial tcp 172.217.24.17:443: i/o timeout 原因应该是 GFW 导致 vim-go 部分依赖包下载失败。在做 Go 项目开发的时候,会经常依赖各种轮子,所以需要有类似 Proxy,用于快速下载各种 Package(有 VPN 的请忽略)。<!--more-->Module proxy protocolGo Modules 是 Golang 官方最近几...阅读全文

Segmentfault 2020-10-05 14:32:32 lryong

视频批量采集下载工具,支持抖音,腾讯,爱奇艺,好看,西瓜,火锅...

goanniegoannie 是一个视频资源采集下载的实用工具。目前它还没有 gui ,通过命令行交互的方式操作。获取方式https://gitee.com/rock_rabbit...特点视频批量采集下载cookie设置重复下载过滤应用自媒体视频制作者环境开发测试:windows10 x64支持 __ __ ___ __ ___ ___ /\_\ __ /'_ `\ / __`\ /'__`\ /' _ `\ /' _ `\/\ \ /'__`\ /\ \L\ \/\ \L\ \/\ \L\....阅读全文

Segmentfault 2020-10-04 14:32:33 rockrabbit

解决 go mod 下载依赖报410 Gone错误问题

背景通过 go mod 管理依赖包, 其中有几个依赖是私有仓库的, 之前下载下来没有问题。 最近刚把 Go 版本升级到13, 发现拉不下来,报 410 Gone 。(其实这个报错跟 HTTP Code 410 的语义是一样的,表示资源的访问在源服务器上不再可用 )详细错误类似如下:go get -v bitbucket.org/compay/lucifer go: finding bitbucket.org/compay/lucifer latest go: downloading bitbuc...阅读全文

Segmentfault 2020-10-06 19:32:32 lryong

Go 项目中的 BDD 实践

背景研发同学完成功能开发后,一般通过单元测试或手动测试,来验证自己写的功能是否正确运行。 但是这些测试很多是从开发角度出发,存在样例单一、测试覆盖率不全、非研发同学无法较全面了解产品的行为表现等情况。<!--more-->近几年 BDD 作为一种流行的测试方式和产品验收手段,能较好地解决以下两个问题:减少开发和产品的沟通成本,增加协作。比如产品经理通过 feature文件的方式,更具体地给开发者说明想要预期效果。综合测试。 BDD 能够把上线之后手工测试这一过程自动化。基于上面两点,本文介绍了团...阅读全文

Segmentfault 2020-10-06 14:32:33 lryong

理解 Go 的互斥锁

背景在使用 Go 构建 Web 应用程序时,所有传入的 HTTP 请求都会被路由到对应处理逻辑的 Goroutine 中。如果应用程序在处理请求的时候,有读写同一块内存数据, 就存在竞态条件的风险。( Spanner 支持 读写锁定 的事务模式,单个逻辑时间点以原子方式执行一组读写,不存在竞态条件问题)<!--more-->数据竞争一个很常见的竞态条件场景就是银行账户余额的读写。考虑一种情况,有两个 Goroutine 尝试同时将钱存到同一个银行余额中,例如:指令Goroutine1Gorout...阅读全文

Segmentfault 2020-10-05 15:32:33 lryong

go 限流篇章

方式 漏桶算法: 讲究的是服务器匀速的去处理并发请求,但... 为达到目的居然采用sleep了。简单来说服务器匀速处理请求,超过桶容量会被舍弃 令牌桶算法:拿到令牌的请求被处理,否则被舍弃。在桶里面的令牌被拿光了的时候,此时就是一边生产令牌一边消耗令牌了,这种场景下也匀速了。存峰值,峰值为桶容量 + 消耗此容量所需时间产生的新token。 你需要搞清楚 熔断 与 限流是比较常用的服务降级方案,属于主动触发。 服务熔断:打比方你对外提供的服务又5个子服务组成,其中2个是核心服务,3个是非核心服务,...阅读全文

简书 2020-10-01 03:32:43 Best博客

Golang中使用JSON时区分空字段和未设置字段的方法

几周前, 我在使用 Golang 微服务, 需要添加使用 JSON 数据的 CURP 操作的支持. 通常, 我会为实体创建一个结构体, 该结构体中定义了所有字段以及 'omitempty' 属性, 如下所示 type Article struct { Id string `json:"id"` Name string `json:"name,omitempty"` Desc string `json:"desc,omitempty"` } 问题但是这种表示形式带来了严重的问题, 尤其对于 Upd...阅读全文

简书 2020-10-01 03:32:43 MO_ON_e503

【go语言学习】面向对象oop

go并不是一个纯面向对象的编程语言。在go中的面向对象,结构体替换了类。 go并没有提供类class,但是它提供了结构体struct,方法method可以在结构体上添加。提供了捆绑数据和方法的行为,这些数据和方法与类类似。 面向对象的基本思想主要体现在封装,继承以及多态等的设计与运用上。下面来看看封装、继承与多态在golang中是如何实现的。 一、封装 封装主要是通过访问权限控制实现的。 在Java中,共有public 、protected、default、private这四种权限控制。 而相应...阅读全文

简书 2020-10-01 03:32:43 Every_dawn

2020-09-30:谈谈内存对齐。

福哥答案2020-09-30:#福大大架构师每日一题# 2020-09-30:谈谈内存对齐,如何回答呢? 2020-09-30:谈谈内存对齐。 一、为什么需要内存对齐? 1.平台。 2.性能。 二、各种语言的内存对齐规则如下: 1.C++: 空类的内存大小为1字节。继承n个空类,内存大小是n-1个字节。 规则如下: 1)第一个成员在与结构体偏移量为0的地址处。 2)其他成员变量要对齐到对齐数的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。 VS中默认的对齐数为8...阅读全文

简书 2020-10-01 03:32:40 福大大架构师每日一题

重试机制的实现

服务在请求资源,如果遇到网络异常等情况,导致请求失败,这时需要有个重试机制来继续请求。 常见的做法是重试3次,并随机 sleep 几秒。 业务开发的脚手架,HTTP Client 基本会封装好 retry 方法,请求失败时根据配置自动重试。下面以一个常见的 HTTP Client 为例, 看下它是如何实现请求重试。 最后整理其他一些重试机制的实现。<!--more-->go-resty 重试机制的实现先看下 go-resty 在发送 HTTP 请求时, 请求重试的实现:// Execute me...阅读全文

Segmentfault 2020-10-04 14:32:33 lryong

golang数值型字符串比较大小

package main import "fmt" func main() { s1 := "3" s2 := "12" //直接比较时,从左至右逐个字符根据ASCII码值大小比较,会出错 if s1 > s2 { fmt.Println("直接比较结果:", s1, ">", s2) } //优化比较,先比较位数再比较大小 if len(s1) == len(s2) { if s1 > s2 { fmt.Println("优化比较结果:", s1, ">", s2) } else { fmt....阅读全文

简书 2020-09-30 16:32:50 王小奕er

倒排索引

产品经理需要了解的搜索算法:搜索引擎之倒排索引 http://www.woshipm.com/pmd/745525.html 倒排索引的简单介绍和实现 https://blog.argcv.com/articles/3008.c java 实现倒排索引 http://wangtao.gift/2018/02/01/java-%E5%AE%9E%E7%8E%B0%E5%80%92%E6%8E%92%E7%B4%A2%E5%BC%95/ 数据结构与算法(18):倒排索引 http://freewil...阅读全文

简书 2020-09-30 16:32:50 yunfeichen119

理解函数的调用过程

一、函数的范围 二、函数的调用 2.1 函数的进入 2.2 函数的退出 2.3. 函数返回值的传递 (不同编译器、不同平台是不一样的) 2.4. Go为什么可以返回多个值? 一、函数的范围 ebp寄存器指向函数的栈底,esp寄存器指向函数的栈顶,共同划分了函数的活动范围。 减小esp的值相当于在栈上开辟空间,而增大esp的值相当于在栈上回收空间; 二、函数的调用 2.1 函数的进入 参数入栈,从右到左,有的通过寄存器传递; call function(1将当前指令的下一个指令地址压入栈中.2跳转...阅读全文

简书 2020-09-30 16:32:50 梦工厂

优秀而惊艳的 raft

定义 通过一个 Leader 来实现节点共识和日志一致 https://www.linkinstar.wiki/2019/06/12/golang/open-source-component/etcd-raft/ 细节 通信 投票 RPC:候选人发起,选举期间,通知各个节点进行投票 日志 RPC:领导者发起,进行日志复制和提供心跳(没有日志的请求) 任期 任期单调递增 发现自己的任期小(收到任期大消息)会立即变成 follower 收到任期小的消息,直接拒绝 选举 Leader 定期心跳,保证自...阅读全文

简书 2020-09-30 16:32:48 LinkinStar