第一个golang项目

第一个golang项目

  • 开发环境
  • 安装golang
  • Visual Studio Code安装golang语言插件
  • 初始化项目
    • 创建目录
    • 初始化golang配置
  • 开始开发
    • 安装所需依赖
    • 创建main.go
    • 创建配置文件
    • 创建命令
      • 版本命令
      • 查看指定目录指定后缀文件并将指定内容替换为新内容
  • 打包并运行

  • 前因后果:因为工作需要使用一些工具将指定文件的特定内容替换成新的内容,然而网上找了一圈要不是收费要不是linux平台的shell脚本,使用都太麻烦。so…就想自己写一个小工具来完成自己的需求,所以就有了这个项目。
  • 目的是记录一下整个过程。
  • 基于本人有一定开发基础的前提下进行。

开发环境

  • 操作系统:Window 10
  • CPU:Intel® Core™ i5-7500 CPU @ 3.40GHz 3.40 GHz
  • 内存:16.0 GB
  • 硬盘:1TB
  • 开发工具:Visual Studio Code(需要安装golang语言插件)

安装golang

  • 安装golang,下载绿色版go1.23.0.windows-amd64
  • 配置环境PATH变量,增加golang安装路径
  • 配置环境变量,CGO_ENABLED=1
  • 配置环境变量,GO111MODULE=on
  • 配置环境变量,GOPROXY=https://goproxy.cn,国内代理加速
  • 安装mingw-w64
  • 配置环境PATH变量,增加mingw-w64安装路径
  • 验证go安装版本,执行go version
    go version

Visual Studio Code安装golang语言插件

在这里插入图片描述

初始化项目

创建目录

  • 打开Visual Studio Code
  • 创建一个本地目录dev-tools
  • 在这里插入图片描述

初始化golang配置

  • 打开终端

  • 在这里插入图片描述

  • 执行go mod init gitee/eddy-org/dev-tools

  • 在这里插入图片描述

开始开发

安装所需依赖

# toml配置文件依赖
go get -u github.com/spf13/viper
go install github.com/spf13/viper

在这里插入图片描述
此时项目的基本结构已经完成,会出现go.mod、go.sum两个文件
在这里插入图片描述

创建main.go

  • 创建main.go
  • 这是程序入口,其中包含main函数
package mainimport ("flag""gitee/eddy-org/dev-tools/commands""log""os"
)func main() {if len(os.Args) >= 2 {if os.Args[1] == "version" {commands.Version()} else if os.Args[1] == "replace" {var dir stringflagSet := flag.NewFlagSet("devtools command: ", flag.ExitOnError)flagSet.StringVar(&dir, "dir", "", "Which dir to replace")if err := flagSet.Parse(os.Args[2:]); err != nil {log.Printf("解析参数失败: %v", err)os.Exit(1)}commands.Replace(dir)}}
}

创建配置文件

  • 创建配置文件config.toml
  • 里面配置了版本号、以及我们内容替换的一些参数
version = "0.0.1"[standard]
root-path = "E:\\release\\release-v3\\standard\\"
suffix = ".setting"
current-version = "v3.5.9"
new-version = "v3.6.0"[standard-fix]
root-path = "E:\\release\\release-v3\\standard-fix\\"
current-version = "v3.5.9"
suffix = ".setting"
new-version = "v3.6.0"[saas]
root-path = "E:\\release\\release-v3\\saas\\"
suffix = ".setting"
current-version = "v3.5.9"
new-version = "v3.6.0"[saas-fix]
root-path = "E:\\release\\release-v3\\saas-fix\\"
suffix = ".setting"
current-version = "v3.5.9"
new-version = "v3.6.0"

创建命令

  • 先创建commands目录
  • 创建version.go,用于查看当前工具版本
package commandsimport ("bufio""log""os""github.com/spf13/viper"
)func Version() {viper.SetConfigName("config") // 配置文件名(不包含扩展名)viper.SetConfigType("toml")   // 配置文件格式viper.AddConfigPath(".")      // 查找配置文件的路径if err := viper.ReadInConfig(); err != nil {log.Fatalf("Error reading config file, %s", err)}version := viper.Get("version").(string)log.Printf("current version is %s", version)log.Printf("程序执行完毕,请按Enter键退出...")reader := bufio.NewReader(os.Stdin)reader.ReadByte() // 读取一个字节,这将阻塞直到用户输入
}
  • 创建replace.go,用于实现我的内容替换需求
package commandsimport ("bufio""log""os""path/filepath""strings""github.com/spf13/viper"
)func walkDir(dir, suffix string) []string {var files []stringerr := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if !info.IsDir() && strings.HasSuffix(info.Name(), suffix) {files = append(files, path)}return nil})if err != nil {log.Printf("walkDir: %v", err)}return files
}func replaceContentInFile(filePath, oldStr, newStr string) error {// 读取文件内容content, err := os.ReadFile(filePath)if err != nil {return err}// 替换内容newContent := strings.ReplaceAll(string(content), oldStr, newStr)// 写入新内容到文件return os.WriteFile(filePath, []byte(newContent), 0644)
}func Replace(dir string) {viper.SetConfigName("config") // 配置文件名(不包含扩展名)viper.SetConfigType("toml")   // 配置文件格式viper.AddConfigPath(".")      // 查找配置文件的路径if err := viper.ReadInConfig(); err != nil {log.Fatalf("Error reading config file, %s", err)}// 使用参数log.Printf("Replace dir is %s", dir)pathKey := dir + ".root-path"suffixKey := dir + ".suffix"currentKey := dir + ".current-version"newKey := dir + ".new-version"rootPath := viper.Get(pathKey).(string)suffix := viper.Get(suffixKey).(string)oldStr := viper.Get(currentKey).(string)newStr := viper.Get(newKey).(string)log.Printf("rootPath is %s", rootPath)log.Printf("suffix is %s", suffix)log.Printf("oldStr is %s", oldStr)log.Printf("newStr is %s", newStr)files := walkDir(rootPath, suffix)log.Printf("Find files %d", len(files))for _, file := range files {err := replaceContentInFile(file, oldStr, newStr)if err != nil {panic(err)}}log.Printf("程序执行完毕,请按Enter键退出...")reader := bufio.NewReader(os.Stdin)reader.ReadByte() // 读取一个字节,这将阻塞直到用户输入
}

版本命令

go run main.go version

在这里插入图片描述

查看指定目录指定后缀文件并将指定内容替换为新内容

go run main.go replace -dir standard-fix

在这里插入图片描述

打包并运行

go build -v -ldflags "-linkmode external -extldflags '-static' -w" -o devtools.exe main.go
devtools.exe version
devtools.exe replace -dir standard-fix

在这里插入图片描述

https://gitee.com/xqxyxchy/dev-tools
尽情享用吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1524133.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Sui Hacker House曼谷站报名开启:在Devcon 2024期间探索Sui区块链创新

Sui 曼谷 Hacker House 报名开启 Sui Bangkok Hacker House 将在曼谷于 2024 年 11 月 4 日至 17 日举办。诚邀开发者深入学习 Move 语言,在 Sui 网络上构建 MVP ,在充满活力的曼谷中度过难忘的两周。 诚挚地邀请开发者加入为期两周的 Sui Bangkok Hacker House。 你将与其他…

CentOS7 MySQL 数据库基本使用

3.查看当前库中存在哪些表 mysql> show tables 4.查看表的结构 mysql> describe user mysql> describe mysql.user 5.查询数据库服务的基本信息 mysql> status 二、创建及删除库和表 1.创建新的库 CREATE DATABASE 语句:用于创建一个新的库&…

图像白平衡

目录 效果 背景 什么是白平衡? 实现原理 将指定图色调调整为参考图色调主要流程 示例代码 效果 将图一效果转换为图二效果色调: 调整后,可实现色调对换 背景 现有两张图像,色调不一致,对于模型重建会有影响。因…

不小心删除丢失了所有短信?如何在 iPhone 上查找和恢复误删除的短信

不小心删除了一条短信,或者丢失了所有短信?希望还未破灭,下面介绍如何在 iPhone 上查找和恢复已删除的短信。 短信通常都是非正式和无关紧要的,但短信中可能包含非常重要的信息。因此,如果您删除了一些短信以清理 iPh…

vivado 创建时间约束1

步骤3:创建时间约束 在此步骤中,您打开合成的设计并使用AMD Vivado™定时约束 男巫定时约束向导分析门级网表并发现缺失 约束。使用“定时约束”向导为此设计生成约束。 1.在“流导航器”中,单击“打开综合设计”。 2.当综合设计打开时&#…

使用vscode编辑matlab完美解决方法

vscode里面的matlab插件都不好用,需要搭配互补一下 1先安装MATLAB 这个插件可以进行代码高亮、格式化、跳转,F5运行所有代码,或者选中要运行的代码,右键单独运行, 优点:运行速度很快,和matlab里…

HA里面如何添加美的智能设备

环境: Home Assistant 2023.8.0 问题描述: HA里面如何添加美的智能设备 解决方案: 1.打开 HACS 菜单,点开其中的集成选项,点击右下角的“浏览并下载存储库”,之后再搜索 Midea AC LAN 点击下载 如果下…

Qt将数据库中的数据导出为html

一、源码分享 bool ReportFormUtils::exportReportHtml(QString &errString, const QString tableName, const QString savePathAndName, const QString tableTitle, const QString tableInfo) {Q_UNUSED(errString)Q_UNUSED(tableName)Q_UNUSED(savePathAndName)#define …

ubuntu上通过openvswitch卸载实现roce over vxlan

环境 操作系统: uname -a Linux 5.4.0-187-generic #207-Ubuntu SMP Mon Jun 10 08:16:10 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux Mellanox网卡: ethtool -i ens6np0 driver: mlx5_core version: 23.10-2.1.3 firmware-version: 20.39.3004 (MT_0…

HarmonyOS NEXT仓颉编程语言开发环境搭建(安装DevEco Studio Cangjie Plugin)

仓颉编程语言开发环境搭建主要是两部分: 安装最新版DevEco Studio;在DevEco Studio里面安装仓颉插件(DevEco Studio Cangjie Plugin)。 本文主要介绍DevEco Studio Cangjie Plugin的使用。 DevEco Studio Cangjie Plugin概述 …

【机器人工具箱Robotics Toolbox开发笔记(一)】Matlab机器人工具箱简介

MATLAB是一款被广泛应用于科学计算和工程领域的专业软件。它的全称为Matrix Laboratory(矩阵实验室),因为其最基本的数据类型就是矢量与矩阵,所以在处理数学和科学问题时非常方便,可用于线性代数计算、图形和动态仿真的…

探索Python世界的趣味之旅:自制贪吃蛇游戏

通过本次贪吃蛇游戏的开发实践,不仅可以掌握Python编程语言的基础知识,还深入了解了游戏开发的基本流程和技术要点。这只是一个开始,Python的世界远不止于此。未来,你可以尝试开发更复杂、更有趣的游戏项目,甚至探索人…

Leetcode每日刷题之76.最小覆盖子串(C++)

1.题目解析 本题的题目是给定两个字符串 s 和 t ,找出在 s 中的某个最小子串保证该子串中包含所以 t 中出现的字母即可,并且该结果是唯一答案,找不到结果就直接返回空串即可 2.算法原理 关于本题的核心思路就是"滑动窗口"&#xff…

教育行业解决方案:智能PPT在教育行业的创新应用

在信息化时代,教育行业面临着巨大的变革。随着人工智能技术的不断发展,传统教学方式正在被重新定义。彩漩科技作为 AI 技术的先行者,推出了歌者 PPT &彩漩 PPT,为教师、学生和家长提供了一种全新的教育体验,实现了…

开源云原生数据库PolarDB PostgreSQL 15兼容版本正式发布

开源云原生数据库PolarDB PostgreSQL 15兼容版正式发布上线,该版本100%兼容开源PostgreSQL 15。PolarDB是阿里云自研云原生关系型数据库,基于共享存储的存算分离架构使其具备灵活弹性和高性价比的特性,在开源PostgreSQL很好的性能表现的基础上…

Java 入门指南:Java 并发编程 —— Java 线程池详解

线程池 线程池(ThreadPool)是一种用于管理和复用线程的机制,它可以预先创建一批线程,并维护一个线程队列,用于执行提交的任务。 线程池的主要目的是提高多线程应用程序的性能和效率,通过重用已创建的线程…

【陪诊系统-H5客户端】订单状态进度条

似乎~客户端相对来说,要简单一点,就挑几个其中感兴趣的记录一下 订单状态进度条是根据当前订单的状态动态改变,这里的动态改变实际上是利用后端返回的状态数据,给标签添加不同的class属性来实现。进度条样式其实是两个圆角矩形框…

ABAP正则表达式 特殊字符处理

REPLACE ALL OCCURRENCES OF REGEX [[:space:]] IN <fs_purhdinfo>-cell_value WITH ."可去掉空格或回车键 REPLACE ALL OCCURRENCES OF &#xff1a; IN <fs_purhdinfo>-cell_value WITH ."可去掉空格或回车键 REPLACE ALL OCCURRENCES OF R…

AI绘画SD中如何安装/更新/卸载 Stable Diffusion WebUI 插件?SD新手必看的保姆级教程!

大家好&#xff0c;我是画画的小强 最近有一部分朋友对如何在AI绘画StableDiffusion中 安装管理 WebUI 插件十分陌生&#xff0c;不知道如何下手。 今天就系统地为大家介绍一下 WebUI 插件安装、更新、卸载的相关知识&#xff0c;让初学者能快速掌握插件的使用方法&#xff0c…

iomuxc、pinctrl子系统、gpio子系统(学习总结)

iomuxc、pinctrl子系统、gpio子系统三者的关系 相互依赖&#xff1a;IOMUXC、pinctrl子系统和gpio子系统在功能上相互依赖。IOMUXC提供了引脚复用和电气属性的配置能力&#xff0c;pinctrl子系统负责从设备树中获取这些配置信息并完成初始化&#xff0c;而gpio子系统则在引脚被…