12.Golang设计模式之享元模式

享元模式 GitHub代码链接 享元模式(Flyweight Pattern)只要用于减少创建对象的数量,以减少内存占用和提高性能。 什么是享元模式 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新的对象。 解决了什么问题 在有大量对象时,又能会造成内存溢出。我们把其中共同的部分抽象出来,如果有相同的业务 请求,直接返回内存已有的对象,避免重复创建。 优点 大大减少对象的创建 缺点 提高了系统复杂度,需要分离出外部状态和内部状态。而且外部状态具有固有化性质,不应该 随着内部状态的变...阅读全文

简书 2020-10-05 10:32:40 ShawnLee_123

Golang 中 GPM 之 G 的执行(一、准备阶段)

从之前的文章《Golang 中 GPM 之 G 从哪里来》,我们知道了 Golang 对于使用 G 是有一定的复用机制,这样减少了资源的浪费,接下来我们要看下 G 生成后会怎么样 func newproc1(fn *funcval, argp unsafe.Pointer, narg int32, callergp *g, callerpc uintptr) { ... newg := gfget(_p_) if newg == nil { newg = malg(_StackMin) casg...阅读全文

简书 2020-10-05 10:32:40 未tu

go——字节

内容 1 byte/rune 2 bit基本操作 3 字节序 4 一个bit使用例子——bitmap 一 byte/rune 编码: 编码就是人类语言字符和存储中计算机中的字节的一种映射表,最开始是用ascii编码表就可以表示完所有的英文字符,但是没法表示其他语言字符,所以诞生了unicode、utf-8等不同的编码表;go中用byte和rune类型来代表ascii字符和unicode字符; byte和uint8是等价的,通常处理ascii字符,因为只用8位来存储,实际只可以存储256个字符,所...阅读全文

简书 2020-10-05 10:32:40 酷酷码农

【go语言学习】通道channel

通道channel被认为是goroutine通信的管道。类似于水管里的水可以从一端流向另一端,数据可以从一端发送到另一端,通过通道接收。 当多个goroutine间想实现共享数据时,可以使用传统的同步机制(sync包的方法),但是go语言强烈建议使用channel通道来实现goroutine之间的通信。 “不要通过共享内存来通信,而应该通过通信来共享内存”这是一句风靡golang社区的经典语言。 Go语言中,要传递某个数据给另一个goroutine(协程),可以把这个数据封装成一个对象,然后把这...阅读全文

简书 2020-10-05 10:32:38 Every_dawn

golang mod开发模式

用变量 GO111MODULE 开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是 auto。 GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。 GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。 GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。 在使用模块的时候,GOPATH 是无意...阅读全文

简书 2020-10-05 10:32:38 golang才是未来

Go Micro 微服务搭建

最近因为要用到 go-micro,所以在学习微服务相关的内容,这一篇是记录 micro 的搭建过程。安装环境micro 提供了一个 runtime,在使用 go-micro 之前需要先安装它。有以下几种方式安装源码go get github.com/micro/micro/v2这种方式我装不上,不是网络的原因,不知道哪里有冲突。。。dockerdocker pull micro/micro二进制# MacOS curl -fsSL https://raw.githubusercontent.co...阅读全文

Segmentfault 2020-10-09 16:32:34 五行缺金

GIt commit 规范

最近有幸参与到了一个开源项目的活动,看到别人提交的 commit 都很规范,自己的都是些什么鬼?经过一番搜索,发现网上很多都提到了 angularjs 的规范。 格式 Commit Message 格式 <type>(<scope>): <subject> <空行> <body> <空行> <footer>分为 页眉、正文和页脚。其中页眉包括了类型、范围还有 subject。type类型描述 feat新增 featurefix修复bugdocs仅仅修改了文档,比如 README...style修...阅读全文

Segmentfault 2020-10-09 10:32:33 五行缺金

docker 安装 kms 服务器

网上找激活码很麻烦,激活工具又不敢用,索性自己建一个 kms 服务器了。。<!--more-->vlmcsd 是与 Microsoft 兼容的 KMS 服务器,是 KMS 服务器的一个开源实现,接下来就用 docker 来搭建一个。安装 Docker使用 docker 比较方便,即便以后换了系统也无所谓,少很多麻烦Debian系安装脚本wget -qO- https://get.docker.com/ | sh也可以使用自带的包管理器安装安装 vlmscddocker pull mikolate...阅读全文

Segmentfault 2020-10-09 07:32:32 五行缺金

高并发下的流量控制

背景目前在做一个消息中台,提供给业务方各种消息通道能力。我们在系统设计过程中,除了有对业务方在使用时做 Quota 限制;也有对请求做流量控制(几w+ QPS),防止并发流量上来时打垮服务。下面是个人在调研流量控制方案的一些梳理和总结。高并发解决方案概述并发通常是指并发访问,也就是在某个时间点,有多少个访问请求同时到来。机器的性能是有限的,如果这个量级达到一定程度,就会造成系统压力,影响系统性能。应对高并发流量的几种解决方案:流量优化: 防盗链处理前端优化: 减少 HTTP 请求,合并 CSS ...阅读全文

Segmentfault 2020-10-08 20:32:33 lryong

Go并发编程之传统同步—(1)互斥锁

前言先回顾一下,在 C 或者其它编程语言的并发编程中,主要存在两种通信(IPC):进程间通信:管道、消息队列、信号等线程间通信:互斥锁、条件变量等利用以上通信手段采取的同步措施,最终是为了达到以下两种目的:维持共享数据一致性,并发安全控制流程管理,更好的协同工作Go语言中除了保留了传统的同步支持,还提供了特有的 CSP 并发编程模型。传统同步互斥锁接下来通过一个“做累加”的示例程序,展示竞争状态(race condition)。不加锁开启 5000 个 goroutine,让每个 gorouti...阅读全文

Segmentfault 2020-10-08 19:32:31 sown

TDD 实践报告

作业2: TDD实践报告实验环境操作系统:Mac OS编译器:VScode迭代章节练习练习1修改测试代码,以便调用者可以指定字符重复的次数,然后修复代码首先编写测试文件 repeat_test.go 代码和章节中给出的基本相同,只需要更改 Repeat() 函数中的参数为两个,一个是需要重复的字符串,另一个是重复的次数,代码如下package iteration import "testing" func TestRepeat(t *testing.T) { repeated := Repeat...阅读全文

Segmentfault 2020-10-08 10:32:33 hupf3

搭建 CTFd 平台

现在 CTF 比赛很火 ,我们学校也要搞一个比赛,搭建平台这些活就由我来干了,在这过程中遇到了一些问题,做个记录,方便以后再搭建的时候操作。平台选择我选择的是 CTFd 这个框架,网上的资料很多,配上插件,搭建动态靶机靶场很方便。查找资料一开始的时候是打算手动安装各种环境的,不过当我看到有提供了用 docker 安装的方式后,还是打算用 docker 了,一是方便,而是以后即使在不同的环境上搭建,都是一样的操作。下载项目项目地址: github, 这是我新建的一个仓库,从分支 修改而来的,可以直...阅读全文

Segmentfault 2020-10-08 10:32:32 五行缺金

GoLang 环境配置

Golang 环境配置系统硬件与操作系统:64位Windows操作系统,处理器 Intel(R) Core(TM) i7-8750 CPU @ 2.20GHz安装过程安装 VSCode 编辑器直接上官网上下载 VSCode 即可,按照安装提示即可完成安装。在VSCode上运行Golang语言的好处Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,可在 Windows,macOS 和 Linux 桌面上运行。它内置了对JavaScript,TypeScript和Node....阅读全文

Segmentfault 2020-10-07 11:32:33 hupf3

【go语言学习】错误error和异常panic

一、错误和异常的区别 错误指的是可能出现问题的地方出现了问题。比如打开一个文件时失败,这种情况在人们的意料之中 。 异常指的是不应该出现问题的地方出现了问题。比如引用了空指针,这种情况在人们的意料之外。 可见,错误是业务过程的一部分,而异常不是 。 二、错误演示 go语言中,错误是一种数据类型,使用内置的error类型,和其他数据类型一样使用。 package main import ( "fmt" "os" ) func main() { _, err := os.Open("a.txt") ...阅读全文

简书 2020-10-03 00:32:39 Every_dawn

Golang设计模式之组合模式

组合模式 GitHub代码链接 Composite Pattern 组合模式,又叫部分整体模式。用于把一组相似的对象当做一个单一的对象。 什么是组合模式 组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。使得用户对单个对象的使用具有一致性。 解决了什么问题 组合模式在树形结构的问题中,模糊了简单元素和复杂元素的概念。客户程序一个像处理简单元素一样来处理复杂元素。从而使得客户程序与复杂的元素的内部结构解耦。 优点 高层模块调用简单 节点自由增加 缺点 使用组合模式时,其叶子和树枝的声明...阅读全文

golang之sync包之WaitGroup

sync包 sync是synchronization同步这个词的缩写,所以也会叫做同步包。这里提供了基本同步的操作,比如互斥锁等等。这里除了Once和WaitGroup类型之外,大多数类型都是供低级库例程使用的。更高级别的同步最好通过channel通道和communication通信来完成。 WaitGroup 同步等待组,在类型上,它是一个结构体。一个WaitGroup的用途是等待一个goroutine的集合执行完成。主goroutine调用了Add()方法来设置要等待的goroutine的数...阅读全文

简书 2020-10-03 00:32:39 追梦人在路上不断追寻

2020-10-01:谈谈golang的空结构体。

福哥答案2020-10-01:#福大大架构师每日一题# 1.map。 value是空结构体,构造集合。 2.通道。 只传递信号,不传递数据。 3.切片。 不管切片多长,都不会占用空间。 4.仅包含方法的结构体。 不用指针,节约空间。 5.最后零字段。 final zero field:结构体里的最后一个属性如果是空结构体,会当成1个字节处理。如果结构体嵌套的全是空结构体,还是0个字节。 评论阅读全文

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

分页对齐写入文件——golang实现

将内存中的数据写入文件时,往往是有多少,就直接写入多少。当频繁的写入小批量数据,因反复系统调用导致性能较差;此外,有时要求按照一定字节对齐的方式写入文件。为了解决以上两个问题,本文实现了分页写入的方案。 1. 数据结构设计 //以页为单元写入文件,或者通过flush写入 type PageWriter struct { w io.Writer // pageOffset为当前已写入页的偏移量(相对于buff的起始地址),因有可能非完整的页已写入文件(flush方式),所以新的写入应该先补齐这非完...阅读全文

简书 2020-10-03 00:32:38 卜是