第一个golang项目

news2024/11/17 2:33:40

第一个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 main

import (
	"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 string
			flagSet := 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 commands

import (
	"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 commands

import (
	"bufio"
	"log"
	"os"
	"path/filepath"
	"strings"

	"github.com/spf13/viper"
)

func walkDir(dir, suffix string) []string {
	var files []string

	err := 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.coloradmin.cn/o/2088247.html

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

相关文章

不可错过的10款电脑监控软件推荐,电脑监控软件哪个好?宝藏安利

电脑监控软件已成为企业管理和家庭安全的重要工具。 无论是为了提升工作效率、保障信息安全,还是为了监督孩子的学习情况,一款优秀的电脑监控软件都能发挥巨大作用。 本文将为您推荐10款不可错过的电脑监控软件,并详细分析它们的优势与特点&…

Elastic Stack(三):Logstash介绍及安装

目录 1 Logstash介绍1.1 组件介绍1.2 Logstash 工作原理 2 Logstash安装2.1 logstash-源码包安装8.1.01、logstash安装2、创建配置文件3、启动4、配置快速启动文件 1 Logstash介绍 1.1 组件介绍 Logstash是一个开源数据收集引擎,具有实时管道功能。Logstash可以动…

财富趋势金融大模型已通过备案

财富趋势金融大模型已通过备案 8月28日晚,国内领先的证券软件与信息服务提供商——财富趋势,公布了其2024年上半年财务报告: 今年上半年,财富趋势营收1.48亿元,同比增长0.14%;实现归母净利润为1亿元&#x…

适用于 Windows 的文件恢复软件

我很遗憾我在 Windows中从 PC 中删除了数据并再次移动了它们。当我检查时,什么都没有。是否有任何 Windows 数据恢复软件,或者是否可以想象?我会看到任何援助的价值。 文档、图像、音频等数据文件可能会因意外删除、感染攻击、系统崩溃等不良…

mac os系统

各种各样的系统优缺点-CSDN博客 目录 一:mac os是什么系统?图形用户界面的革命性操作系统 二:mac os是什么系统:高性能和无缝衔接,功能丰富、安全可靠 三:mac os是什么系统:全新界面设计和卓…

Tomcat 环境配置及部署Web项目

一.环境 Java Tomcat 二.Java环境 1.下载安装JDK 2.修改及新建环境变量 3.查看Java 版本 三.Tomcat 环境 1.下载及解压Tomcat 2.配置环境变量 3.验证安装,运行startup.bat 访问:http://localhost:8080/ 三.Web项目 1.修改Tomcat配置文件 2.拷贝W…

Python将Latex公式插入到Word中

推荐一个库,可以使用python将Latex公式插入到Word中显示 使用pip进行安装: pip install latex2word 示例将如下公式插入到word 公式1: f(x) \int_{-\infty}^\infty \hat f(x)\xi\,e^{2 \pi i \xi x} \,\mathrm{d}\xi 公式2: \int x^{\mu}…

重生奇迹MU 小清新职业智弓MM

游戏中有一种令人迷醉的职业——智弓MM,她们以高超的射箭技能闻名于世。本文将为您介绍这个悠闲的小清新职业,在游戏中的特点以及如何成为一名出色的智弓MM。跟随我们一起探索这个奇妙而神秘的职业吧! 悠闲的游戏节奏是游戏的初衷之一&#…

Dataease1.8.23 local本地安装

1、安装视频 手把手带你安装DataEase(一)Local模式部署 DataEase 免费开源BI工具 开源数据可视化分析工具 2、图文 安装模式 - DataEase 文档 注意点: 1、数据库:mysql 1)my.cnf 新增配置: #忽略大小…

35岁以上程序员转行AI绘画领域:以Stablediffusion和Midjourney为舟,扬帆起航

前言 在技术浪潮的推动下,35岁的程序员面临职业转型的十字路口。AI绘画领域,以其独特的艺术创新和技术融合,为中年程序员提供了一个全新的舞台。利用AI工具如Stablediffusion和Midjourney,35岁以上的程序员可以在这个领域实现自我…

第二证券:三折折叠屏手机呼之欲出,14股业绩暴涨超200%

智能制作龙头大手笔投建机器人超级工厂 8月29日晚间,埃夫特发布公告称,公司拟运用自有或自筹资金在安徽省芜湖市经过购买土地用于出资制作埃夫特机器人超级工厂暨全球总部项目,根据初步测算,项目出资金额约人民币18.93亿元&#…

CAD二次开发IFoxCAD框架系列(25)- 自动加载和初始化的使用

自动加载,意思就是我们不需要每次重启都得要去输入netload加载软件,这个我们该怎么解决,CAD给我们提供了注册表的方式来进行加载,IFoxCAD给我们提供了非常便捷的操作注册表的方法。 namespace ifoxgse.Core.System;public static…

【算法】带你快速搞懂 二分查找算法问题(图解+练习)

目录 ❤️一:二分查找分析简介❤️ ❤️二:二分查找代码实现❤️ ​编辑 ❤️三:二分查找代码分析图解❤️ ❤️四:解决二分查找相关题型❤️ 💕4.1:二分查找题型一💕 💕4.2&a…

java文件操作和IO流(详解)(๑•́ ₃ •̀๑)エー

目录 😄一.认识文件 1.1文件的概念与组成: 1.2树形结构组织与目录: 1.3文件路径: 😚二.文件系统操作 2.1File类概述: 2.2案例演示: 案例演示一: 演示案例二: 🤪…

【Python系列】signal信号处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Unix 系统

各种各样的系统优缺点-CSDN博客 目录 █ 操作系统的诞生 █ UNIX的诞生 █ Linux的诞生 █ Linux和Unix的关系 █ Linux的发行版 说到操作系统,大家都不会陌生。我们天天都在接触操作系统——用台式机或笔记本电脑,使用的是windows和macOS系统&…

Docker续2:docker部署前端项目

一、部署前端页面 [rootlocalhost ~]# ls //导入dist项目 anaconda-ks.cfg centos_httpd.tar centos_nginx centos.tar centos_yum.tar dist [rootlocalhost ~]# docker pull mysql //下载mysql [rootlocalhost ~]# docke…

深入垃圾回收:理解GC的核心算法与实现

垃圾回收(Garbage Collection,GC)是现代编程语言中一项关键技术。它不仅解决了内存管理中的诸多问题,还为开发者提供了一个更高效、更安全的编程环境。本文将深入探讨GC的起源、主要算法以及这些算法在不同编程语言中的具体实现。…

你好GPT-4o,程序员如何通过GPT-4o提升自己的编码能力

目录 round 1:图片识别能力ChatGPT4oClaude3.5 Sonnet图片识别能力小结:图片识别能力,ChatGPT4o完胜。 round 2:代码能力ChatGPT4oClaude3.5 Sonnet代码能力小结:代码能力,Claude3.5 Sonnet小胜。 round 3&…

Git之1.0版本重要特性及用法实例(五十二)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者. 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列…