有点不安全却又一亮的 Go unsafe.Pointer

在上一篇文章《深入理解 Go Slice》中,大家会发现其底层数据结构使用了 unsafe.Pointer。因此想着再介绍一下其关联知识 前言 在大家学习 Go 的时候,肯定都学过 “Go 的指针是不支持指针运算和转换” 这个知识点。为什么呢? 首先,Go 是一门静态语言,所有的变量都必须为标量类型。不同的类型不能够进行赋值、计算等跨类型的操作。那么指针也对应着相对的类型,也在 Compile 的静态类型检查的范围内。同时静态语言,也称为强类型。也就是一旦定义了,就不能再改变它 错误示例 func main(){ num := 5 numPointer := &num flnum := (*float32)(numPointer) fmt.Println(flnum) } 输出结果:

深入理解 Go Slice

是什么 在 Go 中,Slice(切片)是抽象在 Array(数组)之上的特殊类型。为了更好地了解 Slice,第一步需要先对 Array 进行理解。深刻了解 Slice 与 Array 之间的区别后,就能更好的对其底层一番摸索 😄 用法 Array func main() { nums := [3]int{} nums[0] = 1 n := nums[0] n = 2 fmt.

fmt 标准库 --- Print* 是怎么样输出的?

前言 package main import ( "fmt" ) func main() { fmt.Println("Hello World!") } 标准开场见多了,那内部标准库又是怎么输出这段英文的呢?今天一起来围观下源码吧 🤭 原型 func Print(a ...interface{}) (n int, err error) { return Fprint(os.Stdout, a...) } func Println(a .

使用 Gomock 进行单元测试

在实际项目中,需要进行单元测试的时候。却往往发现有一大堆依赖项。这时候就是 Gomock 大显身手的时候了 Gomock 是 Go 语言的一个 mock 框架,官方的那种 🤪 安装 $ go get -u github.com/golang/mock/gomock $ go install github.com/golang/mock/mockgen 第一步:我们将安装 gomock 第三方库和 mock 代码的生成工具 mockgen。而后者可以大大的节省我们的工作量。只需要了解其使用方式就可以 第二步:输入 mockgen 验证代码生成工具是否安装正确。若无法正常响应,请检查 bin 目录下是否包含该二进制文件

「连载十」分布式链路追踪 gRPC + Opentracing + Zipkin

在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法。想看看方法的指标,却无处下手? 本文将通过 gRPC + Opentracing + Zipkin 搭建一个分布式链路追踪系统来实现查看整个系统的链路、性能等指标。 Opentracing 是什么 OpenTracing 通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现 不过 OpenTracing 并不是标准。因为 CNCF 不是官方标准机构,但是它的目标是致力为分布式追踪创建更标准的 API 和工具 名词解释 Trace 一个 trace 代表了一个事务或者流程在(分布式)系统中的执行过程

「连载九」gRPC Deadlines

前言 在前面的章节中,已经介绍了 gRPC 的基本用法。那你想想,让它这么裸跑真的没问题吗? 那么,肯定是有问题了。今天将介绍 gRPC Deadlines 的用法,这一个必备技巧。内容也比较简单 Deadlines Deadlines 意指截止时间,在 gRPC 中强调 TL;DR(Too long, Don’t read)并建议始终设定截止日期,为什么呢? 为什么要设置 当未设置 Deadlines 时,将采用默认的 DEADLINE_EXCEEDED(这个时间非常大) 如果产生了阻塞等待,就会造成大量正在进行的请求都会被保留,并且所有请求都有可能达到最大超时 这会使服务面临资源耗尽的风险,例如内存,这会增加服务的延迟,或者在最坏的情况下可能导致整个进程崩溃 gRPC Client func main() { ... ctx, cancel := context.

「连载八」对 RPC 方法做自定义认证

前言 在前面的章节中,我们介绍了两种(证书算一种)可全局认证的方法: TLS 证书认证 基于 CA 的 TLS 证书认证 Unary and Stream interceptor 而在实际需求中,常常会对某些模块的 RPC 方法做特殊认证或校验。今天将会讲解、实现这块的功能点 课前知识 type PerRPCCredentials interface { GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) RequireTransportSecurity() bool } 在 gRPC 中默认定义了 PerRPCCredentials,它就是本章节的主角,是 gRPC 默认提供用于自定义认证的接口,它的作用是将所需的安全认证信息添加到每个 RPC 方法的上下文中。其包含 2 个方法:

「连载七」让你的服务同时提供 HTTP 接口

前言 接口需要提供给其他业务组访问,但是 RPC 协议不同无法内调,对方问能否走 HTTP 接口,怎么办? 微信(公众号、小程序)等第三方回调接口只支持 HTTP 接口,怎么办 我相信你在实际工作中都会遇到如上问题,在 gRPC 中都是有解决方案的,本章节将会进行介绍 🤔 为什么可以同时提供 HTTP 接口 关键一点,gRPC 的协议是基于 HTTP/2 的,因此应用程序能够在单个 TCP 端口上提供 HTTP/1.1 和 gRPC 接口服务(两种不同的流量)

「连载六」Unary and Stream interceptor

前言 我想在每个 RPC 方法的前或后做某些事情,怎么做? 本章节将要介绍的拦截器(interceptor),就能帮你在合适的地方实现这些功能。 有几种方法 在 gRPC 中,大类可分为两种 RPC 方法,与拦截器的对应关系是: 普通方法:一元拦截器(grpc.UnaryInterceptor) 流方法:流拦截器(grpc.StreamInterceptor) 看一看 grpc.UnaryInterceptor func UnaryInterceptor(i UnaryServerInterceptor) ServerOption { return func(o *options) { if o.unaryInt != nil { panic("The unary server interceptor was already set and may not be reset.

「连载五」基于 CA 的 TLS 证书认证

前言 在上一章节中,我们提出了一个问题。就是如何保证证书的可靠性和有效性?你如何确定你 Server、Client 的证书是对的呢? CA 为了保证证书的可靠性和有效性,在这里可引入 CA 颁发的根证书的概念。其遵守 X.509 标准 根证书 根证书(root certificate)是属于根证书颁发机构(CA)的公钥证书。我们可以通过验证 CA 的签名从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书(客户端、服务端) 它包含的文件如下: 公钥 密钥 生成 Key openssl genrsa -out ca.key 2048 生成密钥 openssl req -new -x509 -days 7200 -key ca.