Go - struct{} 实现 interface{}

在 Go 语言中,一个 struct 实现了某个接口里的所有方法,就叫做这个 struct 实现了该接口。下面写一个 Demo 实现一下,先写一个 Study interface{},里面需要实现 4 个方法 Listen、Speak、Read、Write,然后再写一个 study struct{},去全部实现里面的方法,然后分享一下代码心得。代码示例// main.go package main import ( "demo/study" "fmt" ) func main() { name ...阅读全文

51CTO博客 2021-04-27 17:03:36 wx6087c7391d3cd

Go - 学习 grpc.Dial(target string, opts …DialOption) 的写法

咱们平时是这样使用 grpc.Dial 方法的,比如:conn, err := grpc.Dial("127.0.0.1:8000", grpc.WithChainStreamInterceptor(), grpc.WithInsecure(), grpc.WithBlock(), grpc.WithDisableRetry(), )咱们怎么能写出类似这样的调用方式,它是怎么实现的?这篇文章咱们写一个 Demo,其实很简单,一步步往下看。一opts …DialOption,这个是不定参数传递,参...阅读全文

51CTO博客 2021-04-27 17:02:56 wx6087c7391d3cd

Go - time.RFC3339 时间格式化

在开发过程中,我们有时会遇到这样的问题,将 2020-11-08T08:18:46+08:00 转成 2020-11-08 08:18:46,怎么解决这个问题?解决这个问题,最好不要用字符串截取,或者说字符串截取是最笨的方法,这应该是时间格式化的问题。我们先看一下 golang time 包中支持的 format 格式:const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" Ruby...阅读全文

51CTO博客 2021-04-27 17:02:20 wx6087c7391d3cd

Go - 常用签名算法的基准测试

签名验证是为了保证接口安全和识别调用方身份,同时还需要满足以下几点:可变性:每次的签名必须是不一样的。时效性:每次请求的时效性,过期作废。唯一性:每次的签名是唯一的。完整性:能够对传入数据进行验证,防止篡改。签名规则大同小异,根据自己的业务情况进行制定即可。签名过程中我们会用到的几种算法,接下来 分享一下每个算法的基准测试,可能会存在误差,供大家参考。MD5 单向散列加密func BenchmarkEncrypt(b *testing.B) { b.ResetTimer() for i := 0...阅读全文

51CTO博客 2021-04-27 16:58:48 wx6087c7391d3cd

Go - 实现项目内链路追踪

为什么项目内需要链路追踪?当一个请求中,请求了多个服务单元,如果请求出现了错误或异常,很难去定位是哪个服务出了问题,这时就需要链路追踪。这个图画的比较简单,从图中可以清晰的看出他们之间的调用关系,通过一个例子说明下链路的重要性,比如对方调我们一个接口,反馈在某个时间段这接口太慢了,在排查代码发现逻辑比较复杂,不光调用了多个三方接口、操作了数据库,还操作了缓存,怎么快速定位是哪块执行时间很长?不卖关子,先说下本篇文章最终实现了什么,如果感兴趣再继续往下看。实现了通过记录如下参数,来进行问题定位,关...阅读全文

51CTO博客 2021-04-27 16:58:00 wx6087c7391d3cd

Go - 基于 GORM 获取当前请求所执行的 SQL 信息

前言为了便于精准排查问题,需要将当前的请求信息与当前执行的 SQL 信息设置对应关系记录下来,记录的 SQL 信息包括:执行 SQL 的当前时间;执行 SQL 的文件地址和行号;执行 SQL 的花费时长;执行 SQL 的影响行数;执行的 SQL 语句;数据库组件使用的是 GORM。思路1、在执行 SQL 前,设置开始执行时间(计算执行时长会用到);2、在执行 SQL 后,第一,获取当前请求的上下文,为什么获取上下文,因为需要从上下文中获取本次请求信息,第二,获取 SQL 执行前的时间,用来计算执...阅读全文

51CTO博客 2021-04-27 16:55:14 wx6087c7391d3cd

[系列] - go-gin-api 路由中间件 - 签名验证(七)

概览首先同步下项目概况:上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大神,只不过在本地实践了而已,对于 Go 语言的使用,我还是个新人,在这里感谢大家的厚爱!这篇文章咱们分享:路由中间件 - 签名验证。为什么使用签名验证?这个就不用多说了吧,主要是为了保证接口安全和识别调用方身份,基于这两点,咱们一起设计下签名。调用方需要申请 App Key 和 App Secret。A...阅读全文

51CTO博客 2021-04-27 16:39:45 wx6087c7391d3cd

Go - 如何解析 JSON 数据?

概述最近掉进需求坑了,刚爬上来,评估排期出现了严重问题,下面三张图很符合当时的心境。谈需求估排期开始干为啥会这样,我简单总结了下:与第三方对接。跨团队对接。首次用 Go 做项目。业务流程没屡清楚就出排期(大坑)。需求调整后未进行调整排期(大坑)。有了这次经验,后期关于如何评估排期也可以和大家唠唠。废话不多说了,进入今天主题。今天给大家分享用 Go 如何解析 JSON 数据,包含三种情况,强类型解析、弱类型解析、返回结构不确定 等。JSON 结构比如,请求了手机归属地的接口,json 数据返回如下...阅读全文

51CTO博客 2021-04-27 16:38:29 wx6087c7391d3cd

[系列] - go-gin-api 路由中间件 - Jaeger 链路追踪(六)

概述首先同步下项目概况:上篇文章分享了,路由中间件 - Jaeger 链路追踪(理论篇)。这篇文章咱们分享:路由中间件 - Jaeger 链路追踪(实战篇)。说实话,这篇文章确实让大家久等了,主要是里面有一些技术点都是刚刚研究的,没有存货。先看下咱们要实现的东西:API 调用了 5 个服务,其中 4 个 gRPC 服务,1 个 HTTP 服务,服务与服务之间又相互调用:Speak 服务,又调用了 Listen 服务 和 Sing 服务。Read 服务,又调用了 Listen 服务 和 Sing ...阅读全文

51CTO博客 2021-04-27 16:38:03 wx6087c7391d3cd

Go - 数组

概述数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成,一旦声明了,数组的长度就固定了,不能动态变化。len() 和 cap() 返回结果始终一样。声明数组package main import ( "fmt" ) func main() { //一维数组 var arr_1 [5] int fmt.Println(arr_1) var arr_2 = [5] int {1, 2, 3, 4, 5} fmt.Println(arr_2) arr_3 := [5] in...阅读全文

51CTO博客 2021-04-27 16:36:50 wx6087c7391d3cd

Go - httpclient 常用操作

模块介绍httpclient 是基于 net/http 封装的 Go HTTP 客户端请求包,支持常用的请求方式、常用设置,比如:支持设置 Mock 信息支持设置失败时告警支持设置失败时重试支持设置项目内部的 Trace支持设置超时时间、Header 等请求说明方法名描述httpclient.Get()GET 请求httpclient.Post()POST 请求httpclient.PostForm()POST 请求,form 形式httpclient.PostJSON()POST 请求,jso...阅读全文

51CTO博客 2021-04-27 16:36:29 wx6087c7391d3cd

Go - 结构体

概述结构体是将零个或多个任意类型的变量,组合在一起的聚合数据类型,也可以看做是数据的集合。声明结构体//demo_11.go package main import ( "fmt" ) type Person struct { Name string Age int } func main() { var p1 Person p1.Name = "Tom" p1.Age = 30 fmt.Println("p1 =", p1) var p2 = Person{Name:"Burke", Age:...阅读全文

51CTO博客 2021-04-27 16:36:08 wx6087c7391d3cd

Go - 循环

概述前几篇文章分享了 array 数组、slice 切片、map 集合,这篇文章分享如何循环获取里面的元素,同时也是对前几篇文章的复习。本篇文章会用到的关键字 for、range、break、continue、goto、switch。循环 array//demo_18.go package main import ( "fmt" ) func main() { person := [3] string {"Tom", "Aaron", "John"} fmt.Printf("len=%d cap...阅读全文

51CTO博客 2021-04-27 16:35:49 wx6087c7391d3cd

Go - 函数

概述学习了一些基础语法,开始学习写函数了,分享几个自己写的函数。MD5获取当前时间戳获取当前时间字符串生成签名函数定义func function_name(input1 type1, input2 type2) (type1, type2) { // 函数体 // 返回多个值 return value1, value2 }函数用 func 声明。函数可以有一个或多个参数,需要有参数类型,用 , 分割。函数可以有一个或多个返回值,需要有返回值类型,用 , 分割。函数的参数是可选的,返回值也是可选的...阅读全文

51CTO博客 2021-04-27 16:35:29 wx6087c7391d3cd

Go - 变量声明

概述在声明变量之前,咱们先了解下变量的数据类型,这篇文章主要涉及 字符串、布尔、数字,其他类型后面开篇再说。数据类型字符串string只能用一对双引号("")或反引号(``)括起来定义,不能用单引号('')定义!布尔bool只有 true 和 false,默认为 false。数字整型int8 uint8int16 uint16int32 uint32int64 uint64int uint,具体长度取决于 CPU 位数。浮点型float32 float64常量声明常量,在程序编译阶段就确定下来的...阅读全文

51CTO博客 2021-04-27 16:35:08 wx6087c7391d3cd

Go - 实现项目内链路追踪(二)

上篇文章 Go - 实现项目内链路追踪 分享了,通过 链路 ID 可以将 请求信息、响应信息、调用第三方接口的信息、调试信息、执行的 SQL 信息、执行的 Redis 信息 串起来,记录的具体参数在文件中都有介绍。这篇文章在上面的基础上,新增 2 个功能点:新增将 调用 gRPC 接口信息 记录到 Trace 中;新增对记录的敏感信息进行脱敏处理;调用 gRPC 接口信息记录参数Object,结构如下:type Grpc struct { Timestamp string `json:"time...阅读全文

51CTO博客 2021-04-27 16:33:59 wx6087c7391d3cd

[系列] - go-gin-api 规划目录和参数验证(二)

概述首先同步下项目概况:上篇文章分享了,使用 go modules 初始化项目,这篇文章咱们分享:规划目录结构模型绑定和验证自定义验证器制定 API 返回结构废话不多说,咱们开始吧。规划目录结构├─ go-gin-api │ ├─ app │ ├─ config //配置文件 │ ├─ config.go │ ├─ controller //控制器层 │ ├─ param_bind │ ├─ param_verify │ ├─ ... │ ├─ model //数据库ORM │ ├─ proto...阅读全文

51CTO博客 2021-04-27 16:33:39 wx6087c7391d3cd

Go - 一个对新手很友好的项目(带界面)

这个开源项目就是:go-gin-api ,目前 800+ Star。go-gin-api 是基于 Gin 进行模块化设计的 API 框架,封装了常用的功能,使用简单,致力于进行快速的业务研发,同时增加了更多限制,约束项目组开发成员,规避混乱无序及自由随意的编码。下载后可直接运行$ git clone https://github.com/xinliangnote/go-gin-api $ cd go-gin-api $ go run main.go -env fat // -env fat 设置...阅读全文

51CTO博客 2021-04-27 16:31:37 wx6087c7391d3cd