`
daihongtao110121
  • 浏览: 15695 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

golang之批文件编译

 
阅读更多
需求:用一个golang 文件去编译批量的go文件
一:访问需要编译的文件
     为什么要有这样的需求?总不可能又很多要go文件的情况下,你去一个一个的执行吧,那显然是不聪明的做法,于是就有了这样的需求。想要去编译批量文件,首先需要做的就是先要找到,只有找到了我们想要的文件才能进行编译,这个前提不能少。那么golang官方文档提供我们去访问目录的方法为path包下的filepath包中的Walk方法。引入相关包以及查询文件代码如下
package main

imoport(
        "path/filepath" 
        "fmt"
         "os"
)
/**查询文件信息根据传来的参数作为walk()方法的root节点*/
func queryFile(){
	flag.Parse()
	root:=flag.Arg(0)
	if root==""{
		log.Fatal("请输入要查询的目录位置:")
	}
	err :=filepath.Walk(root,func(path string,f os.FileInfo,err error) error {
		fmt.Println("f...",f.Name())           
	})

	if err!= nil{
		fmt.Println("filePath.Walk return:%v \n",err)
	}	
}

func main(){
       queryFile()
}

当go run 该文件后(要加路径名!!!),效果如如下:

下面来稍做分析,对于接收命令行参数就我知道的有两种方法,一种就是我用到的。另外一种如下:
commandPath:=os.Args
if len(commandPath)==1{
       log.Fatal("请输入参数")
}
root:commandPath[1]
两种的唯一不同就是后面这种命令行参数是作为下标为1所在的地方。看了文档很久,也就大概才理解到“因为是下面这种模式下把前面的执行语句也当做是一个参数了,但是上面一种因为在调用flag.Parse()方法时没有对flag参数进行定义,所以命令行输入的才算真正开始。不知道这种理解对不对。在来看下面的Walk方法,主要就是里面的那个func(...)匿名函数起作用,找到文件夹并遍历都是由它来完成。
但是这种做法存在一种缺点,那就是一旦该walk函数执行完毕找到的文件信息也就消失了:那么是否可以封装该匿名函数方法,将读取到的文件信息保存与自己定义的文件结构体中呢?

/****定义一个用于保存文件信息的结构体*/
type sysFile struct{
	fName 	string
	fSize    int64
	fIsDir   bool
}
/**保存文件的目录结构*/
type F struct{
	file []*sysFile
}
/***封装一个查看目录结构的方法同时将目录中的文件信息记录起来*/
func (self *F)visit(path string,info os.FileInfo,err error) error{
	if (info==nil){
		return err
	}
	
	//存储文件信息,这这里就保存了文件名,大小,是否为文件
	infoFile:=&sysFile{
		fName:	info.Name(),
		fSize:	info.Size(),
		fIsDir: info.IsDir(),
	}

	self.file=append(self.file,infoFile)
	return nil
}

这样以来,我们就封装好了查看目录的方法,相应的我们调用Walk方法时稍做修改:
self:=F{
	file:make([]*sysFile,0),
}
err :=filepath.Walk(root,func(path string,f os.FileInfo,err error) error {
	return self.visit(path,f,err)
})

这样就能避免必须要在匿名函数中区操作文件了,因为你已经保存了,该修改部分参考原文http://www.ohlinux.com/archives/818/当做到这里的时候你是不是觉得已经离需求很近很近了?答案必须是肯定的。文件我们已经得到了,现在主要就是对这些批文件进行编译了。要程序实现构建go文件,那么就只有调用shell命令了:
/**根据command的不同执行相关shell 命令*/
func invokeCommand(command string){
	if command==" "{
		return
	}
	cmd:=exec.Command("/bin/sh","-c",command)
	err:=cmd.Run()
	if err!= nil{
		fmt.Println(command,"操作失败!")
		return
	}
}

剩下的问题就是要去拼接shell命令了,然后将拼接好的传递该方法就ok啦!:

/**根据参数fileName判断是否为go文件,并且拼接shell命令*/
func pingCommand(fileName string){
	//拼接好需要编译的命令与文件名字符串(go build +fileName)
	//筛选为所有go文件才执行
	
	if !strings.HasSuffix(fileName,".go"){
		fmt.Println(fileName,"不是go文件,不进行编译")
		return
	}		

	command:=`go build `+fileName
	invokeCommand(command)

	/***将编译好的文移动到与批文件目录下同级的bin目录下aimDir**/
	execFileName:=strings.TrimSuffix(fileName,".go")
	mvCommand :=`mv `+execFileName+` `+aimDir
	invokeCommand(mvCommand)
	
}


能够调用方法了,我们是不是把他们否封装在一个编译文件方法里去调用会更好呢:

/***根据文件夹名编译里面的所有go文件,在这里还是要将go build当做shell 命令去调用*/
func buildFile(self F){
	//1.首先先创建一个bin目录,用于保存编译后产生的可执行文件
	cmd:=`mkdir `+aimDir
	invokeCommand(cmd)

	 //调用pingCommand()方法
	fmt.Println()
        for _,v:=range self.file{
	     if !v.fIsDir{
             	pingCommand(v.fName)
	     }	
        }	
}

最后就只需要对每一个文件调用buildFile就好了!!!一举攻下它

这样变完成了所需的了,用一个文件就能编译出整个目标文件夹下的所有go文件并生成可执行文件了!!!

二:感想
对于使用新的golang语言其实感觉还是很不错的,简单说说我觉得的优点吧
1.没有那么多硬性的规定,比如每行都不需加要分号,这里编译时会自动加上
2.在判断的时候不需要圆括号
3.可以返回多值
4.自动匹配类型用起来特别爽
当然也有很烦人的地方,当控制语句之有一条语句同样需要用{}括起来。总体来说还不错吧。
今天就到这里了。
  • 大小: 15.2 KB
  • 大小: 41.7 KB
  • 大小: 41.7 KB
1
0
分享到:
评论

相关推荐

    golang写的文件批量删除工具delete_tool.exe

    在IT行业中,高效处理大量文件是常见的需求之一,尤其在系统维护、数据清理等场景。本文将深入探讨一个由Golang编程语言编写的批量文件删除工具——delete_tool.exe。Golang,又称为Go语言,是由Google开发的一种...

    golang实现的读取excel模板批量生成excel工具.zip

    总结起来,"golang实现的读取excel模板批量生成excel工具"是利用Go语言和Excellize库实现的一个高效工具,它简化了从模板批量生成Excel文件的过程,且提供了预编译的exe文件,便于用户直接使用。这个项目展示了Go...

    golang读取excel模板批量生成word工具.zip

    在IT领域,编程语言Go(Golang)以其高效、简洁和强大的并发能力受到广大开发者的喜爱。本项目涉及的知识点是使用Go语言读取Excel模板并批量生成Word文档,这在数据处理、报告自动化或者批量生成定制化文档的场景中...

    [Golang]视频搜索脚本

    6. **可执行文件打包**:在Windows平台上,Go的`go build`命令可以将源代码编译为可执行文件,如`getViedo.exe`。这使得用户无需安装Go环境就能直接运行程序。 7. **错误处理**:在编写这样的脚本时,错误处理至关...

    minio 文件服务器

    MinIO提供预编译的二进制文件,适用于多种操作系统。你可以从官方网站(https://min.io/download)获取最新版本。下载后,解压并在命令行中运行MinIO服务,通常命令如下: ```bash ./minio server /path/to/data ```...

    Go-enmasse一个实用程序来创建GMail邮件草稿从golang编译模板和JSON数据

    这个程序的独特之处在于它结合了模板编译和JSON数据,使得动态生成邮件内容变得更加方便和高效。在Go语言中,模板引擎是标准库的一部分,它允许开发者通过模板语法来构建动态内容。JSON数据则是一种轻量级的数据交换...

    Go-go-adbbot:基于adb和golang的androidbot

    Golang,通常简称为Go,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。Go语言设计时注重简洁、效率和可移植性,特别适合编写并发程序和服务。在这里,Go语言被用作实现自动化bot的...

    Golang_Puzzlers-春节主题资源

    在Golang社区中,存在着一批热爱挑战和技术探讨的人,他们通过解决各种编程难题,深化对Go语言的理解。而“Golang_Puzzlers-春节主题资源”这一项目,便是围绕Go语言学习与提升而设计的一系列编程难题和教程资源。 ...

    Go-go-fsevents在golang中使用inotify递归文件系统事件监视器

    标题中的“Go-go-fsevents在golang中使用inotify递归文件系统事件监视器”指的是一项技术,它允许Go语言(Golang)开发者利用`go-fsevents`库来实现对文件系统事件的监控,特别是递归式的监控。在Unix-like系统中,...

    tianai-captcha-go-golang资源

    在项目文件结构中,“.gitignore”文件通常包含一系列规则,用于指示Git版本控制系统忽略掉对项目构建无贡献的文件和目录,如编译生成的目标文件、本地配置文件等。这样做可以保持版本库的清洁,使得开发者可以专注...

    go写的批量改文件 名字小工具(源码)

    Go语言,也被称为Golang,由Google开发,其设计目标是提供一种易于阅读和编写的语言,同时具备高效的编译速度和系统级的性能。Go语言特别适合编写网络服务、并发任务处理以及系统工具,因此用于创建批处理工具非常...

    Go-Golang绑定Mozilla的DeepSpeech语音到文本库

    这通常涉及编写一个C源文件,该文件包含了对DeepSpeech库的调用,然后在Go代码中引入这个C源文件。 4. **编译Go代码**:在Go源代码中导入cgo生成的C库,并编译Go程序。确保在编译时链接了DeepSpeech库。 5. **测试...

    Go-RabbitMQ的Golang实例代码

    Go(也称为Golang)是Google开发的一种静态类型的编译型编程语言,以其简洁、高效和并发能力而受到青睐。结合这两者,我们可以构建高性能的消息传递系统。 首先,我们需要安装`rabbitmq-go-client`库,这是一个用于...

    csv2vcf:Golang工具将一些csv文件转换为vcf文件

    `csv2vcf` 是一个基于Golang(Go语言)开发的实用工具,它的主要功能是将CSV(逗号分隔值)格式的文件转换为VCF(电子名片)格式。VCF文件通常用于存储个人联系人信息,如姓名、电话号码、电子邮件地址等,广泛应用...

    Go-Golang程序从一组kafka主题中读取记录并将它们写入elasticsearch集群

    1. **Go语言基础**:Go语言是Google推出的一种静态类型、编译型的编程语言,其设计目标是提高开发者的生产效率和软件运行性能。在本项目中,开发者利用Go的并发模型(goroutines和channels)来高效地处理来自Kafka的...

    基于go、vue的文件上传系统

    Go语言,又称为Golang,是Google推出的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。Go语言以其简洁的语法、高效的性能和内置的并发支持,在后端服务开发中受到青睐。在这个文件上传系统中,Go语言...

    某日葵src批量go开发,源码分享可编译Windows版本

    标题 "某日葵src批量go开发,源码分享可编译Windows版本" 暗示了这是一个使用Golang(Go语言)开发的项目,可能是针对Windows平台的一个后端应用程序。"某日葵"可能是指项目的名字,或者它代表某种功能,如远程控制...

    图片批量压缩工具(支持win+linux)

    描述中提到,该工具可以“直接运行”,这意味着它可能包含一个可执行文件(如`compress-images.exe`,在Windows环境下运行)和一个命令行接口,用户无需编译源代码或安装额外的依赖就能使用。用户只需指定一个文件夹...

    最新vscode1.30 golang开发环境

    这样,当您在VSCode中安装Go包时,编译后的可执行文件将被自动放入该目录,方便运行和调试。 6. **测试环境**:新建一个Go项目,编写简单的`"hello, world!"`程序并运行,检查VSCode是否能够正确识别和运行Go代码。...

    SQLite数据库-批量数据快速入库方法总结-lt

    由于事务的存在,数据库文件只需打开和关闭一次,大幅提升了批量插入数据的效率。 在实现批量数据快速入库的过程中,“事务+批量绑定机制”被证明是最高效的操作方式。文章还通过实际测试来验证这一点。测试基于...

Global site tag (gtag.js) - Google Analytics