![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang
文章平均质量分 78
Golang从入门到放弃。
爱写代码的小男孩
专注云原生。
展开
-
36-搭建通用web开发脚手架
代码】36-搭建通用web开发脚手架。原创 2022-08-08 15:09:42 · 537 阅读 · 0 评论 -
35-gin框架集成zap日志库
本质上是编写两个中间件,在中间件中使用zap日志库去记录日志。Logger() :记录每一次请求相关信息的日志Recovery():recover 程序中可能出现的panic,并且记录日志.。原创 2022-08-08 15:02:08 · 628 阅读 · 0 评论 -
34-zap日志库
自定义编码类型(普通文本、JSON)字段的key时间格式日志级别的大小写输出位置(文件、终端、多个文件)日志级别自定义基于日志级别的策略,比如忽略掉warn级别的日志(有兴趣的同学可以看一下)同时输出日志到文件和终端将全量日志输出到xx.log,同时将err级别的日志输出到xx.err.log里。......原创 2022-08-08 14:58:21 · 763 阅读 · 0 评论 -
33-viper 配置文件加载
viper是适用于Go应用程序的完整配置解决方案。设置默认值从JSON,TOML,YAML,HCL,envfile和javaproperties格式的配置文件中读取实时监控和重新读取配置文件从环境变量中读取从远程配置中心(etcd或consul)读取并监控配置变化从命令行参数读取配置从buffer读取配置显式配置值。...原创 2022-07-25 09:43:48 · 821 阅读 · 0 评论 -
32-validator参数校验
RePassword是我们后端定义的结构体字段名,而请求中使用的是字段。如何是错误提示中的字段使用自定义的名称。只需要在初始化翻译器的时候像下面一样添加一个获取jsontag的自定义方法即可。//修改gin框架中的valiadtor属性,实现自定制ifv,okok{//注册一个获取jsontag的自定义方法v.RegisterTagNameFunc(func(fldreflect.StructField)string{name{"msg"{jsonres。...原创 2022-07-25 09:38:28 · 611 阅读 · 0 评论 -
31-jwt认证
JWT全称JSONWebToken是一种跨域认证解决方案,属于一个开放的标准,它规定了了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。我们需要定制自己的需求来决定JWT中保存哪些数据,比如我们规定在JWT中要存储username信息,那么我们定义一个MyClaimsvarMySecret=[]byte("夏天夏天悄悄过去")...原创 2022-07-21 17:29:45 · 325 阅读 · 1 评论 -
30-cookie和session模式
前后端不分离的场景下使用比较多。原创 2022-07-21 17:21:16 · 231 阅读 · 1 评论 -
29-Gin框架中间件详解
1、gin框架路由使用前缀树,路由注册的过程是构造前缀树的过程,路由匹配的过程就是查找前缀树的过程。2、gin框架的中间件函数和处理函数是以切片的形式的调用链条存在的,我们可以顺序调用也可以借助c.Next()方法实现嵌套调用。3、借助c.Set()和c.Get()方法我们能够在不同的中间件函数中传递数据。httpshttps。......原创 2022-07-21 17:18:41 · 908 阅读 · 0 评论 -
28-gin框架中间件
Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。这个钩子函数就叫做中间件,中间件适合处理一些公共的业务逻辑,比如登录认证,权限校验,数据分页,记录日志,耗时统计等。Gin中的中间件必须是一个类型。例如我们像下面的代码一样定义一个统计请求耗时的中间件。注册中间件在gin框架中,我们可以为每个路由添加任意数量的中间件。为全局路由注册结果:可以取到。为某个路由单独注册运行结果:为路由组注册中间件有以下两种写法。写法1:写法2:中间件注意事项gin默认中间件 默认使用了和原创 2022-07-08 11:44:31 · 1135 阅读 · 1 评论 -
27-gin框架路由管理
HTTP重定向很容易。内部、外部重定向均支持。路由重定向(内部重定向)路由重定向,使用:结果:此外,还有一个可以匹配所有请求方法的方法如下:为没有配置处理函数的路由添加处理程序,默认情况下它返回404代码,下面的代码为没有匹配到路由的请求都返回页面。路由组我们可以将拥有共同URL前缀的路由划分为一个路由组。习惯性一对包裹同组的路由,这只是为了看着清晰,你用不用包裹功能上没什么区别。路由组也是支持嵌套的,例如:通常我们将路由分组用在划分业务逻辑或划分API版本时。Gin框架中的路由使用的是h原创 2022-07-08 11:40:12 · 467 阅读 · 1 评论 -
26-gin框架参数处理以及文件上传
指的是是URL中后面携带的参数,例如:。获取请求的querystring参数的方法如下:结果:当前端请求的数据通过form表单提交时,例如向发送一个POST请求,获取请求数据的方式如下:结果:当前端请求的数据通过JSON提交时,例如向发送一个POST请求,则获取请求参数的方式如下:更便利的获取请求参数的方式,参考下面参数绑定小节。请求的参数通过URL路径传递,例如:。获取请求URL路径参数的方式如下。为了能够更方便的获取请求相关参数,提高开发效率,我们可以基于请求的识别请求数据类型并利用反射机制自动原创 2022-07-08 11:34:24 · 841 阅读 · 0 评论 -
25-Go的web框架gin基本介绍
Go世界里最流行的web框架,github上有32k+的star。基于httprouter开发的web框架。中文文档齐全,简单易用的轻量级框架。下载并安装:第一个Gin示例:RESTfulREST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”或“表现层状态转化”。简单来说,REST的含义就是客户端与web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。只要API程序遵循了REST原创 2022-07-08 11:09:24 · 361 阅读 · 0 评论 -
24-Go操作redis
学redis主要是学习常用数据结构的命令:https://www.redis.com.cn/commands.html。推荐使用docker快速起一个环境go-redis库驱动包目前社区里用的比较多的是 redigo 和 go-redis我推荐使用,目前最新的是v8版本v8新版本相关最新版本的库相关命令都需要传递参数,例如:连接redis哨兵模式连接redis集群基本使用https://redis.uptrace.dev/guide/hll.htmlzset示例根据前缀获取Key原创 2022-07-08 10:56:36 · 234 阅读 · 0 评论 -
23-Go更强大的库-sqlx
在项目中我们通常可能会使用database/sql连接mysql数据库。sqlx可以认为是go语言内置database/sql的超集,它在优秀的内置database/sql基础上提供了一组扩展。这些扩展中除了大家常用来查询的,还有其他强大的功能。基本使用连接数据库查询查询单行数据示例代码如下:查询多行数据示例代码如下:插入、更新、删除sqlx中的exec方法与原生sql中的exec使用基本一致:NamedExec方法用来绑定SQL语句与结构体或map中的同名字段。NamedQuery原创 2022-07-07 11:08:04 · 1549 阅读 · 1 评论 -
22-Go操作mysql
docker快速启动一个MySQL Server容器启动一个终端容器 连接上面的MySQL Server连接Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用database/sql包必须注入一个数据库驱动。使用MYSQL驱动Open打开一个driverName指定的数据库,dataSourceName指定数据源,一般包括数据库文件名和其他连接必要的信息。初始化连接Open函数只是验证其参数格式是否正确,世纪上并不创建于数据库连原创 2022-07-07 11:05:28 · 255 阅读 · 0 评论 -
21-并发错误处理
error:是程序运行过程中预期可能出现的问题(错误)panic:恐慌,是一些程序运行期间不可预期(意想不到的)的问题;代码写的有瑕疵程序遇到panic就崩掉了,可以通过recover实现平滑退出。我们知道可以在代码中使用recover来恢复程序中意想不到的panic, 而panic只会触发当前goroutine中的defer操作。例如在下面的示例代码中,无法在main函数中recover另一个goroutine中引发的panic.执行上面的函数得到如下结果:从输出的结果可以看出程序并没有正常退出,而是原创 2022-07-07 09:34:17 · 187 阅读 · 0 评论 -
20-Go语言之context
在Go http包的server中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户身份认证信息,验证相关token,请求截止时间。当一个请求被取消或超时,所有用来处理该请求的goroutine都应该迅速退出,然后系统才能释放这些goroutine占用的资源。共有的问题:如何在goroutine外部通知goroutine退出?有并发风险原创 2022-07-05 15:15:34 · 200 阅读 · 0 评论 -
19-Go语言之网络编程-net/http
Go语言内置的包提供了HTTP客户端和服务端的实现。HTTP协议是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。Get、Head、Post和PostForm函数发送HTTP/HTTPS请求。程序在使用完response后必须关闭回复的主体。GET请求示例使用包编写一个简单的发送HTTP请求的Client端,代码如下:将上面的代码保存之后编译成可执行文件,执行之后就能在终端打印网站首页的内容了,我们浏览器其原创 2022-07-05 15:12:13 · 188 阅读 · 0 评论 -
18-Go语言之单元测试
Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法或工具。go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以为后缀的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。在文件中有三种类型的函数,单元测试函数,基准测试函数和示例函数。go test命令会遍历所有的文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行,报告测试结果,最后清理测试原创 2022-07-05 15:06:33 · 243 阅读 · 0 评论 -
17-Go并发之锁
互斥锁是一种常见的控制共享资源访问的方法,它能够保证同一时间只有一个goroutine在访问共享资源。Go语言中使用包中的类型实现互斥锁。提供两个方法供我们使用。我们在下面的示例代码中使用互斥锁限制每次只有一个 goroutine 才能修改全局变量,从而修复上面代码中的问题。将上面的代码编译后多次执行,每次都会得到预期的10000.使用互斥锁能够保证同一时间有且只有一个goroutine进入临界区,其他的goroutine则在等待锁;当互斥锁释放后,等待的goroutine才能获取锁进入临界区,多个gor原创 2022-07-04 17:39:05 · 490 阅读 · 0 评论 -
16-Go语言并发之goroutine,channel
首先我们先了解几个与并发编程相关的概念。进程:程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立的单位。线程:操作系统调度执行的最小单位。协程:非操作系统提供而是由用户自行创建和控制的用户态线程,比线程更轻量级。Go语言中的并发程序主要是通过基于CSP的goroutine和channel来实现,当然也支持使用传统的多线程共享内存的并发方式。Goroutine是GO语言支持并发的核心,在一个GO程序中同时创建成百上千个goroutine是非常普遍的,一个goroutine会以一个很小的栈开始其生原创 2022-07-03 16:34:07 · 737 阅读 · 1 评论 -
15-Go语言time和strconv包
时间和日期是我们编程中经常会用到的,本文主要介绍了Go语言内置的time包的基本用法。time包提供了一些关于时间显示和测量用的函数。time包中日历的计算采用的是公历,不考虑润秒。Go语言中使用的类型表示时间。我们可以通过函数获取当前的时间对象,然后从时间对象中可获取到年、月、日、时、分、秒等信息。Location 和time zoneGo语言中使用location来映射具体的时区。时区(Time Zone)是根据世界各国家与地区不同的经度而划分的时间定义,全球共分为24个时区。中国差不多跨5个时区,原创 2022-07-03 12:00:00 · 434 阅读 · 0 评论 -
14-Go语言之反射
程序运行的时候动态的获取变量值或者类型。两个函数 和 反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。Go程序在运行期使用reflect包访问程序的反射信息。在上一篇博客中我们介绍了空接口。 空接口可以存原创 2022-07-03 11:52:35 · 82 阅读 · 0 评论 -
13-Error接口错误处理以及go Module
Go语言中的错误处理和其他语言不一样,它把错误当成一种值来处理,更强调判断错误,处理错误,而不是一股脑的catch错误。Go语言中把错误当成一种特殊的值来处理,不支持其他语言的 捕获异常的方式。接口只包含一个方法----,这个函数需要返回一个描述错误信息的字符串。当一个函数或者方法需要返回错误时,我们通常是把错误作为最后一个返回值。例如下面标准库os打开文件的函数。由于error是一个接口类型,默认零值为 。所以我们通常将调用函数返回的错误与进行比较,以此来判断函数书否返回错误。例如你经常看到类似下面的原创 2022-07-01 09:04:41 · 471 阅读 · 0 评论 -
12-Go语言接口interface
在Go语言中接口(interface)是一种类型,一种抽象的类型。相较于之前章节讲到的那些具体类型,接口更注重“我能做什么的问题”。接口类型就像是一种约定–概括了一种类型应具备的那些方法,在Go语言中提倡使用面向接口的编程方式实现解耦。每个接口类型由任意个方法签名组成,接口的定义格式如下:其中:举个例子,定义一个包含方法的接口。当你看到一个接口类型的值时,你不知道它是什么,唯一知道的就是可以通过调用它的方法来做一些事情。接口就是规定了一个需要实现的方法列表,在GO语言中一个类型只要实现了接口中规定的所有原创 2022-07-01 08:52:15 · 334 阅读 · 0 评论 -
11-标准库fmt以及文件操作
系列函数会将内容输出到系统的标准输出,区别在于函数直接输出内容,函数支持格式化输出字符串,函数会在输出内容结尾天际一个换行符。Fprint系列函数会将内容输出到接口类型的变量w中,通常用这个函数往文件中写入内容。Sprint系列函数会把传入的数据生成并返回一个字符串。格式化占位符系列函数都支持format格式化参数,在这里我们按照占位符将被替换的变量类型划分,方便查询和记忆。示例代码如下:布尔型占位符说明%ttrue或false整型占位符说明原创 2022-07-01 08:47:03 · 1030 阅读 · 1 评论 -
10-Go语言结构体
Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或者部分属性时,这时候在用单一的基本数据类型就无法满足要求了,G哦语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫做结构体,英文。Go语言中通过来实现面向对象。使用和关键字来定义结构体,具体代码格式如下:其中:举个例子,我们定一个的结构体,代码如下:这样我们就有了一个的自定义类型,他有 三个字段。这样我们就可以使用这个结构体就能方便的在程序中表示和存储人信息了。结构体实例化只有当结构体实例化原创 2022-06-30 17:27:05 · 781 阅读 · 3 评论 -
09-自定义类型和类型别名
在Go语言中有一些基本的数据类型,如、、、等数据类型, Go语言中可以使用关键字来定义自定义类型。通过关键字的定义,就是一种新的类型,它具有的特性。自定义类型是程序员根据自己的需要创造的新类型。让代码更易读内置的和 就是类型别名自定义类型和类型别名区别类型别名类型定义表面上看只有一个等号的差异,我们通过下面的这段代码来理解他们之间的区别。结果显示的是类型,表示包下定义的类型。b的类型为。类型别名只在源文件中生效,编译时会被替换成原始类型。...原创 2022-06-30 17:18:06 · 125 阅读 · 0 评论 -
08-Go语言中函数和指针
Go语言中定义函数使用关键字,具体格式如下:其中:函数名:由字母、数字、下划线组成。但函数名的第一个字母不能是数字。在同一个包内,函数名也称不能重名(包的概念详见后文)。参数:参数由参数变量和参数变量的类型组成,多个参数之间使用分隔。返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用包裹,并用分隔。函数体:实现指定功能的代码块。我们先来定义一个求两个数之和的函数:函数的参数和返回值都是可选的,例如我们可以实现一个既不需要参数也没有返回值的函数:函数调用定义了函.原创 2022-06-30 17:15:42 · 723 阅读 · 1 评论 -
07-Go语言中map数据结构用法
map是key-value结构的数据类型,类似于其他语言中的hash table,dict等key必须是可hash的值,是一个确定的值(key的值不能设置了之后又发生了改变)map存储的时候 hash(key) --> 固定的值 --> 把value放到对应的位置保存map[key] : hash(key) --> 得到值 --> 取对应的valueGO语言中的定义语法如下:其中,map类型的变量默认初始值为nil,需要使用make()函数初始化分配内存。语法为:其中cap表示map的容量,该参数虽原创 2022-06-30 17:11:02 · 916 阅读 · 1 评论 -
06-Go语言中数组和切片
基本语法:数组的声明注意事项数组的长度必须是常量,并且长度是数组类型的一部分.数组支持索引访问 、,索引的合法范围:~,不支持负数索引。代码展示数组初始化方式1初始化数组时可以使用初始化列表设置数组元素的值。方式2刚开始无法确定数组长度时,一般情况下我们可以让编译器根据初始值的个数自行推断数组的长度,数组长度用:方式3指定索引值初始化数组:数组的遍历方式1方式2多维数据这里以二维数组为例,三维数组、四维数组类似。二维数组的定义二维数组的遍历方式1:索引遍历方式2:for ra.原创 2022-06-30 17:04:49 · 302 阅读 · 0 评论 -
05-GO语言基础之流程控制语句
for循环Go 语言中的所有循环类型均可以使用关键字来完成。for循环的基本格式如下:条件表达式返回时循环体不停地进行循环,直到条件表达式返回时自动退出循环。switch语句使用语句可方便地对大量的值进行条件判断。goto语句语句通过标签进行代码间的无条件跳转。语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go语言中使用语句能简化一些代码的实现过程。 例如双层嵌套的for循环要退出时:continue语句可以结束当前循环,开始下一次的循环迭代过程,仅限在循环内使用。在 语句后添加标签时原创 2022-06-30 16:58:28 · 88 阅读 · 1 评论 -
04-GO语言基础之运算符
五种运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符注意: (自增)和(自减)在Go语言中是单独的语句,并不是运算符。位运算符对整数在内存中的二进制位进行操作。很多很多个数字中,除了某个数字只出现一次外,其他数字均出现了两次。问如何找出只出现一次的数字?...原创 2022-06-30 16:55:38 · 76 阅读 · 1 评论 -
03-GO语言基础基本数据类型
特殊整型:Go1.13版本之后引入了数字字面量语法,这样便于开发者以二进制、八进制或十六进制浮点数的格式定义数字,例如:, 代表二进制的 101101,相当于十进制的 45。 ,代表八进制的 377,相当于十进制的 255。 ,代表十六进制的 1 除以 2²,也就是 0.25。事例:浮点型计算机中浮点数都是不精确的!Go语言支持两种浮点型数:和。实际写业务遇到浮点数运算都是转成整型来计算的。打印浮点数时,可以使用包配合动词,代码如下:布尔型注意:Go语言中的字符串以原生数据类型出现,使用字符串就像原创 2022-06-30 16:53:15 · 92 阅读 · 0 评论 -
02-Go语言基础变量和常量
Go语言中有25个关键字:变量变量的类型常见的数据类型有:go语言中变量必须先声明才能使用。而且声明后,必须使用。变量初始化GO语言在声明变量的时候,会自动对变量进行初始化。每个变量会被初始化成其类型的默认值。例如:整型和浮点型初始值为.字符串变量的默认值为。布尔型变量默认为.切片,函数,指针变量的默认值为类型推导有时候将变量类型省略,编译器会根据等号右边值类型来推断变量类型短变量赋值在函数内部可以使用更简洁的来声明赋值变量,但是仅仅限于函数内部。匿名变量在使用多重赋值时,如果想要忽略原创 2022-06-30 16:48:50 · 110 阅读 · 1 评论 -
01-Go语言开发环境准备
Go开发环境搭建原创 2022-06-30 16:43:58 · 272 阅读 · 0 评论