Midk9t's Blog

Go编程模式:Functional Options

函数选项问题 在日常开发中,我们经常遇到需要将业务实体初始化的场景,此时必然会定义一些可变参数,如下图Server结构体这个例子: type Server struct { Addr string Port int Protocol string Timeout time.Duration TLS *tls.Config } 其中,只有Addr和Port是必须的,那么我们应该如何去实现初始化Server对象的函数呢?

Go项目惯用结构

前言 无论我们用什么语言,做什么项目,都应该事先对项目的整体文件夹布局做长远考虑:什么文件应该放哪里,这其实十分重要,一个清晰简洁的项目结构让其他贡献者更容易上手,也让自身的维护与拓展更加方便(还能让开发者显得专业懂行)。Go生态圈里有一个项目的常用结构,它十分普遍且广受认可,今天在这里记录一下,以后新建项目时好当个cheatsheet来用。

Docker镜像缓存的优化

我们在用容器化技术来开发项目时,若用到dockerfile来构建容器镜像,那么想必经常需要在开发调试时不断重新构建镜像。然而我用docker这么久才发现缓存优化的重要性,实在惭愧——假如我们正确地编写dockerfile,那么build的时间或许可以缩减很多,从而加速了整个项目的开发过程。下面就聊一下我从官网上看到的一些重要的dockerfile优化技巧。

Go服务如何实现优雅关停

什么是优雅关停 在我们需要关停如http服务等不断循环工作的业务进程时,一般采取以下两种方式: 在Linux命令行ctrl + c,其实背后就是系统发送SIGINT信号 通过kill或者systemctl stop等方式发送SIGTERM信号 那么假如进程在当前处理工作还没完成时收到这些信号,则当前工作就会处于完成一半然后放弃的情况,这就会对业务产生可大可小的影响,所以我们需要“优雅”地处理这些关停信号,在系统发出后拦截它们,并在进程完全退出前处理关停前的一些必要工作。下面就是一个用go channel来实现关停的简单例子。

SSL/TLS工作原理

什么是SSL/TLS? SSL/TLS 是一种用于保护网络通信安全的加密协议。SSL是原始的加密协议,TLS是它的升级版。这个协议的核心是使用非对称加密来确保通信端点能在不可信网络下安全的传输。