123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171user www-data;worker_processes auto;pid /run/nginx.pid;include /etc/nginx/modules-enabled/*.con ...
时间和日期是我们编程中经常会用到的,本文主要介绍了 Go 语言内置的 time 包的基本用法。time 包提供了一些关于时间显示和测量用的函数。
1如何正确表示时间?公认最准确的计算应该是使用“原子震荡周期”所计算的物理时钟了(Atomic Clock, 也被称为原子钟),这也被定义为标准时间(International Atomic Time)。
而我们常常看见的 UTC(Universal Time Coordinated,世界协调时间)就是利用这种 Atomic Clock 为基准所定义出来的正确时间。UTC 标准时间是以 GMT(Greenwich Mean Time,格林尼治时间)这个时区为主,所以本地时间与 UTC 时间的时差就是本地时间与 GMT 时间的时差。
1UTC + 时区差 = 本地时间
国内一般使用的是北京时间,与 UTC 的时间关系如下:
1UTC + 8 个小时 = 北京时间
在Go语言的 time 包里面有两个时区变量,如下:
time.UTC:UTC 时间
time.Local:本地时间
同时,Go语言还提供了 LoadLocation 方法和 ...
技术学习
未读无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯。
logGo语言内置的log包实现了简单的日志服务。
1.使用标准Loggerlog包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print | Printf | Println)、Fatal系列(Fatal | Fatalf | Fatalln)、和Panic系列(Panic | Panicf | Panicln)来使用,比自行创建一个logger对象更容易使用。
例如,我们可以像下面的代码一样直接通过log包来调用上面提到的方法,默认它们会将日志信息打印到终端界面:
12345678910111213package mainimport ( "log")func main() { log.Println("这是一条很普通的日志。") v := "很普通的" log.Prin ...
技术学习
未读日志框架logrus
介绍
Logrus是一个结构化日志处理框架,并且api完全兼容golang标准库的logger日志api, 意味着你可以直接使用Logrus替换logger。logrus具有以下特性:
完全兼容golang标准库日志模块:logrus拥有七种日志级别:debug、info、warn、error、fatal、panic和Trace,这是golang标准库日志模块的API的超集。如果您的项目使用标准库日志模块,完全可以以最低的代价迁移到logrus上。
可扩展的Hook机制:允许使用者通过hook的方式将日志分发到任意地方,如本地文件系统、标准输出、logstash、elasticsearch或者mq等,或者通过hook定义日志内容和格式等。
可选的日志输出格式:logrus内置了两种日志格式,JSONFormatter和TextFormatter,如果这两个格式不满足需求,可以自己动手实现接口Formatter,来定义自己的日志格式。
Field机制:logrus鼓励通过Field机制进行精细化的、结构化的日志记录,而不是通过冗长的消息来记录日志。
logrus是 ...
技术学习
未读实现步骤在Linux系统上安装Nginx服务器,配置图片访问路径(主要是配置nginx.conf的图片路径), 通过浏览器访问指定路径中的图片;
1没有安装的看这里[Nginx、Vsftpd 安装][https://juejin.cn/post/7201491839815368765]
2测试是否能够访问成功
检查nginx安装位置
1whereis nginx
3编辑配置文件1vim /etc/nginx/nginx.conf
在 http { 下面添加 server{…} 中的内容
{1234567891011121314151617181920212223242526272829303132http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; ...
技术学习
未读如何在 Ubuntu 云服务器上使用Nginx部署 Go 语言程序?
Nginx 是一个免费的、开源的、高性能的 HTTP 和反向代理服务,主要负责负载一些访问量比较大的站点。Nginx 可以作为一个独立的 Web 服务,也可以用来给 Apache 或是其他的 Web 服务做反向代理。相比于 Apache,Nginx 可以处理更多的并发连接,而且每个连接的内存占用的非常小。
Nginx的安装没有安装的可以看我的这篇文章,这里就不再水字数了,哈哈 :relieved:
Nginx常用命令
在这里补充几个 Nginx 常用命令。
1234nginx -s stop # 停止 Nginx 服务nginx -s reload # 重新加载配置文件nginx -s quit # 平滑停止 Nginx 服务nginx -t # 测试配置文件是否正确
Nginx反向代理部署推荐使用 nginx 作为反向代理来部署我们的程序,按下面的内容修改 nginx 的配置文件
1234567891011121314151617181920212223242526272829 ...
Go 1.18版本增加了一个主要的新语言特性: 对泛型的支持。在本文中,我不会描述泛型是什么,也不会描述如何使用它们。本文讨论在 Go 代码中何时使用泛型,以及何时不使用它们。
编写代码让我们从编写 Go 程序的一般准则开始:通过编写代码而不是定义类型来编写 Go 程序。在泛型方面,如果通过定义类型参数约束开始编写程序,那么你就错了。应该从编写函数开始。如果明确知道类型参数有用的情况下,很容易在以后添加类型参数。
应该使用类型参数让我们看一下类型参数对哪些情况有用。
使用语言定义的容器类型时当我们编写的是操作 Go 语言定义的特殊容器类型(slice、map和chennel)的函数。如果函数具有包含这些类型的参数,并且函数的代码并不关心元素的类型,那么使用类型参数可能是有用的。
例如,这里有一个函数,它的功能是返回任何类型map中所有的key:
12345678// MapKeys 返回m中所有key组成的切片func MapKeys[Key comparable, Val any](m map[Key]Val) []Key { s := make([]Key, 0, ...
Air能够实时监听项目的代码文件,在代码发生变更之后自动重新编译并执行,大大提高gin框架项目的开发效率。
为什么需要实时加载?之前使用Python编写Web项目的时候,常见的Flask或Django框架都是支持实时加载的,你修改了项目代码之后,程序能够自动重新加载并执行(live-reload),这在日常的开发阶段是十分方便的。
在使用Go语言的gin框架在本地做开发调试的时候,经常需要在变更代码之后频繁的按下Ctrl+C停止程序并重新编译再执行,这样就不是很方便。
Air介绍怎样才能在基于gin框架开发时实现实时加载功能呢?像这种烦恼肯定不会只是你一个人的烦恼,所以我报着肯定有现成轮子的心态开始了全网大搜索。果不其然就在Github上找到了一个工具:Air。它支持以下特性:
彩色日志输出
自定义构建或二进制命令
支持忽略子目录
启动后支持监听新目录
更好的构建过程
安装AirGo这也是最经典的安装方式:
1go get -u github.com/cosmtrek/air
MacOS1curl -fLo air https://git.io/darwin_air
Linux ...
单元测试前言不写测试的开发不是好程序员。我个人非常崇尚TDD(Test Driven Development)的,然而可惜的是国内的程序员都不太关注测试这一部分。 这篇文章主要介绍下在Go语言中如何做单元测试和基准测试。
Go test工具Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的,并不需要学习新的语法、规则或工具。
go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内,所有以_test.go为后缀名的源代码文件都是go test测试的一部分,不会被go build编译到最终的可执行文件中。
在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。
类型
格式
作用
测试函数
函数名前缀为Test
测试程序的一些逻辑行为是否正确
基准函数
函数名前缀为Benchmark
测试函数的性能
示例函数
函数名前缀为Example
为文档提供示例文档
go test命令会遍历所有的*_test.go文件中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然 ...