Go Functional Options Pattern 编程

问题描述 当使用Go语言去构建对象时,通常会调用相应的New方法,去进行初始化的操作。如下代码所示。 但若以后增加新的字段配置,则会破坏函数的兼容性,例如增加超时时间等。 1 2 3 4 5 6 func NewServer(addr string, port int) (server *http.Server, err error) { server = &http.Server{ Addr: fmt.Sprintf("%s:%d", addr, port), } return } Functional Options Pattern Functional Options Pattern简称FOP,是一种软件设计模式。它将函数的核心逻辑的实现,与它的可选参数(功能选项)的实现分开。 这样就可以轻松地修改和定制函数的行为,而不需要担心破坏函数的兼容性问题。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 type options struct { port *int // 字段参数,尽量使用指针的方式,去判定是否有设定该字段。 handler *http....

May 19, 2023

效率脚本 | 快速打开项目仓库

微服务是目前较为流行的后端架构。它是由一组小型、独立的服务组成的。这些服务可以通过 API 相互通信,每个服务都专注于完成一个单一且明确定义的功能。微服务架构的优势在于它能够提高系统的可伸缩性、灵活性和可维护性。使用微服务可以使开发人员更加专注于具体的业务需求,而不是处理整个应用程序。 但常常,后端研发人员需要管理三四十微服务,服务之间的选择和切换会消耗研发人员的耐心,使用命令行来模糊搜索启动任意Git项目会极大提高工作效率。 脚本设计步骤 我习惯将所有Git项目放在系统用户目录下的Projects,即~/Projects下。在~/Projects下创建托管平台文件夹,例如github.com和coding.net文件夹。再在github.com和coding.net文件夹下clone对应的Git项目仓库。 1. 使用命令查找所有包含.git文件夹的路径作为项目单元 1 2 # -t=d搜索文件夹 -a绝对路径 -H搜索范围包含隐藏文件 --regex按照正则表达式搜索 -E排除项 -x为每个结果执行命令 而{//}表示父文件夹 fd -t=d -a -H --regex "\.git$" $HOME/Projects -E "vendor" -E "objects" -E "node_module" -x echo {//} 2. 将项目单元列表传入FZF命令中 1 fzf --height 40% --layout=reverse --preview "tree -C {}" 3. 终端提供可交互流程用于输入打开的IDE或Editor 1 echo -n "Editor: " && read KM_FD_OPEN_REPO_EDITOR && $KM_FD_OPEN_REPO_EDITOR $KM_FD_GIT_REPO_LIST 4. 将以上三个步骤有机的合并,并起个别名 1 alias repos='KM_FD_GIT_REPO_LIST=$(fd -t=d -a -H --regex "\.git$" $HOME/Projects -E "vendor" -E "objects" -E "node_module" -x echo {//} | fzf --height 40% --layout=reverse --preview "tree -C {}") && echo -n "Editor: " && read KM_FD_OPEN_REPO_EDITOR && $KM_FD_OPEN_REPO_EDITOR $KM_FD_GIT_REPO_LIST' 最终效果 支持模糊搜索 支持查询~/Projects目录下任意Git项目仓库 支持任意IDE或Editor工具打开

April 16, 2023