IoC在Go中的应用
一 控制反转与依赖注入 IoC(Ioc—Inversion of Control)控制反转,是一种设计思想,控制反转意味着可以不用在内部进行业务对象的实例化,而是将控制逻辑进行高度抽象,抽象成为一种具有一定签名的协议,将业务对象进行注入,在内部消除了控制逻辑对某一种具体对象的依赖。
在这样的设计方式中,直接将业务对象中进行控制抽象,转化为业务对象对控制协议的依赖。而控制逻辑通过抽象成协议,将对具象业务对象的依赖进行解耦,控制协议不关心到底是什么样的业务对象,只要满足协议签名的任何对象,通过依赖注入的方式,进行具象业务控制。
二 Go中控制反转的案例分析
实现一个数据存放和获取的容器,这个容器具有获取(get)、存放(put)的方法,其实现代码如下。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849package mainimport ( "fmt" "sync")/*@Time ...
Go实现23种设计模式—模版方法模式
一 类别 行为型模式
二 概述 定义一个操作的基本框架,框架中的方法有基本方法和模版方法。模版方法是对基本方法的组装与调用,从而完成固定的逻辑,基本方法是其他子类对接口实现的重载,从而使用相同的模版,产生不同的结果。
三 使用场景 A. 多个子类有共有的方法,并且逻辑基本相同;
B. 很多依赖与某一核心算法,可以将该算法设为模版算法;
C. 重构中对于重复业务逻辑的代码通过设置模版方法如钩子函数、装饰器进行设计;
四 优点 A. 将共有的部分进行封装、减少代码的重复性,以便于系统的高可维护性。
B. 基本方法的实现延迟到子类进行具体实现,控制的行为由父类约束。
五 实现12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667package Templateimport ...
Go实现23种设计模式—门面模式(外观模式)
一 类别 门面模式又叫外观模式,是一种常用的封装模式
二 概述 给一系列具有关联性的子系统的集合提供对外访问的一组接口,调用者不用明确内部具体的业务逻辑,只需要调用这组接口达到目的即可。也就是要求子系统外部与内部不能直接进行通讯,必须通过一个统一的对象进行,而这个统一的对象就是门面。门面模式通过只提供高层次的接口,从而降低了外部与子系统调用的复杂性。
三 关系 门面角色: 了解子系统内部的全部业务逻辑与实现。
子系统角色: 被门面角色的实现对象所调用,等价于外界的客户端。
Client角色: 只需要传入相对应的签名,调用相关方法,就能得到目标结果。
子系统内部: 在实现Clinet调用方业务需求的同时,可以对具体业务进行功能拓展,对外不变,对内多变,增加额外的功能,比如说检验等。
四 门面模式的优点 A. 减少了系统的相互依赖性;在我看来通过门面的代理,直接切断了调用方与各个子系统内部的调用关系,降低了双方的耦合关系,从而降低了系统混乱、依赖。直接将两者的依赖关系转移到 ...
go应用性能分析工具
一 Go性能调优 Go语言的性能主要是体现在四个方面:
A. CPU profile :报告cpu的使用情况,使用一定频率采集程序在cpu和寄存器上的数据;
B. 内存 profile(heap profile):报告程序内存使用情况;
C. Block profiling: 报告goroutine阻塞,不再运行的情况;用来查找和分析死锁;
D. Groutine profling: 报告goroutine的使用情况,区分调用关系;
常用工具:
runtime/pprof:采集工具型应用的数据;
net/http/pprof:采集服务型应用运行数据信息;
二 工具型应用性能分析(runtime/pprof)A. CPU分析1234567891011import ( "runtime/pprof")f, err := os.Create("./cpu.pprof")err = p ...
Go可选参数的优雅使用技巧
前言 在Go语言中,是不支持类似Python的可选参数,在函数进行参数拓展或者配置参数的默认参数就比较麻烦。如果使用不当,会在将来接口拓展中造成很大的影响。
主要影响:
破坏兼容性
直接在函数定义处,添加拓展参数,会导致所以调用处都要进行修改,破坏了代码的完整性,因为有的逻辑中可能不需要该参数。
不破坏兼容性,重新添加一个新的初始化的函数,随着参数添加的越来越多,初始化函数越来越多,非常冗余。
因此使用可选参数配置的方式进行初始化和默认参数的设置就优雅的解决了参数拓展带来的一系列问题。
实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778package mainimport "fmt"// 本文是实现可选参数的最佳实现// 对于函数的可选参数和默认参数配置,通常要在不影响不破坏现 ...
chapter-1 gRPC的概述与发展
一 gRPC概述 gRPC (the “g” stands for something different in every gRPC release) is an inter-process communication technology that allows you to connect, invoke, operate, and debug distributed heterogeneous applications as easily as making a local function call.
gRPC 是一个高性能、开源、通用的RPC框架,是一种进程间通讯技术,由Google推出,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。 在gRPC客户端可以直接调用不同服务器上的远程程序,使用姿势看起来就像调用本地程序一样,轻松的实现远端服务的连接、调用、操作和调试,很容易去构建分布式应用和服务 ...
时序数据库-InfluxDB-1-基础概念与简单实用
一、什么是InfluxDB InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
当前最新稳定版本InfluxDB v2.0
二、InfluxDB基础概念2.1 database(数据库) 同SQL中的database
123456> show databasesname: databasesname----telegraf_internal
2.2 measurement(表) 同SQL中的table
1234567891011121314151617181920212223242526272829> use telegrafUsing database telegraf> show measurementsname: measurementsname----cpudockerdocker_container_blkiodocker_container_cpud ...
protobuf协议与go的转换
protoc的安装
查看版本
1brew search protobuf
安装指定版本
1brew reinstall protobuf@3.1
查看protobuf版本
1protoc --version
plugin插件的安装
123456789101112go get https://github.com/golang/protobuf直接安装,应该会失败;采用github上的包进行代替安装方法如下:git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpcgit clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/netgit clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/textgit clone https://github.com/golang/sys.git $GOPATH/s ...
kratos创建新项目架构
下载
1git clone https://github.com/go-kratos/kratos.git
安装
123切换至目录:/cmd/kratos先安装相关依赖: go mod download执行: go install
配置
12将安装好的应用复制到用户应用程序目录下:cp $GOPATH/bin/kratos /usr/local/bin
初始化项目
在任意地方就可以使用命令进行创建项目:
执行: kraots new fsu
项目结构
12cd fsutree
123456789101112131415161718192021222324.├── LICENSE├── Makefile├── README.md├── api│ ├── README.md│ └── helloworld│ ├── helloworld.pb.go│ ├── helloworld.proto│ ├── helloworld_grpc.pb.go│ └── helloworld_http.pb.go├── cmd│ └── s ...
Golang的垃圾回收与三色标记法
关键词: 垃圾回收 内存管理 自动释放 三色标记 STW
一 STW STW就是Stop the world的缩写或者Start the world的缩写。指从stop到start这两个动作直接的时间间隔,即万物都静止。
STW在垃圾回收过程中保证了实现的正确性、防止了在垃圾回收过程中内存的无限增长等问题,从而停止赋值器对操作对象图的操作过程。
STW的时间会影响系统的性能,在这个过程中,用户的代码被停止运行和放缓运行。STW越长,对用户代码造成的影响越大(延迟)。
在Go1.14之前,没有异步抢占。for {} 这样的goroutine进不去STW阶段,就会造成卡机等现象。Go 1.14 之后,这类 goroutine 能够被异步地抢占,从而使得进入 STW 的时间不会超过抢占信号触发的周期,程序也不会因为仅仅等待一个 goroutine 的停止而停顿在进入 STW 之前的操作上。
二 标记-清除(-Go1.3)
标记(Mark phase)
暂停程序的业务逻辑;
从程序根节点开始遍历所有对象,并标记可达对象;
...