go学习之文件操作与命令行参数
文章目录
- 一、文件操作
- 1.基本介绍
- 2.常用文件操作函数和方法
- 3.关于文件操作应用实例
- 4.写文件操作应用实例(创建文件并写入文件)
- 1)基本介绍
- 2)基本应用实例-方式一
- 5.判断文件是否存在
- 6.统计英文、数字、空格和其他字符数量
- 二、命令行参数
- 1.使用os.Args对参数进行解析
- 2.flag包解析命令行参数
一、文件操作
1.基本介绍
文件对于我们并不陌生,文件是数据源(保存数据的地方)一种,比如大家经常使用的word文件,txt文件,excel文件…都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频声音
文件在程序中是以流的形式来操作的

-
流:数据在数据源(文件)和程序(内存)之间经历的路径
-
输入流:数据从数据源(文件)到程序(内存)的路径
-
输出流:数据从程序(内存)到数据源(文件)的路径
os.File结构体封装所有文件相关操作
2.常用文件操作函数和方法
1)打开一个文件进行操作
os.Open(name string)(*File,error)
2)关闭一个文件:
File.Close()
3)其他的函数和方法在案例提
案例演示
package main
import ("fmt""os"
)
func main(){//打开文件//概念说明: file的叫法//1. file 叫file对象//1. file 叫file指针//1. file 叫file文件句柄file , err := os.Open("D:/test/test01/test.txt")if err !=nil {fmt.Println("open file err=",err)}//输出下文件,看看文件是什么,看出file/就是一个指针fmt.Printf("file=%v",file) //file=&{0xc0420705a0}//关闭文件err = file.Close()if err != nil {fmt.Println("close file err=",err)}}
3.关于文件操作应用实例
1)读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Close, bufio.NewReader(),reader.ReadString函数和方法
package main
import ("fmt""os""io""bufio"
)
func main(){//打开文件//概念说明: file的叫法//1. file 叫file对象//1. file 叫file指针//1. file 叫file文件句柄file , err := os.Open("D:/test/test01/test.txt")if err !=nil {fmt.Println("open file err=",err)}//当函数退出时,要及时的关闭file/*const (defaultBufSize =4096 //默认缓冲区4096个字节)*/defer file.Close() //要及时关闭file句柄,否则会有内存泄露//创建一个*Read ,带缓冲reader :=bufio.NewReader(file)//循环的读取文件的内容for {str,err := reader.ReadString('\n') //读到一个换行符就结束一次if err == io.EOF { //io.EOF表示文件的末尾break}//输出内容fmt.Printf(str)}fmt.Println("文件读取结束")
}
2)读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况。相关方法和函数(ioutil.ReadFile)
package main
import ("fmt""io/ioutil")
func main(){//使用ioutil.ReaderFile一次性将文件读取到位file := "D:/test/test01/test.txt"content, err := ioutil.ReadFile(file)if err !=nil {fmt.Println("read file err=%v",err)}//把读取到的内容显示到终端fmt.Printf("%v",string(content)) //[]byte//因为我们没有显示的open文件,因此也不需要显示的close文件//因为。文件Open和Close背封装到ReadFile函数内部}
注意:这种只适合文件不太大的情况使用
4.写文件操作应用实例(创建文件并写入文件)
1)基本介绍
func OpenFile(name string,flag int,perm FileMode)(file *File,err error)
说明:os.OpenFile是一个更一般性的文件打开函数,它会使用指定的选项(如O_RDONLY)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于i/o如果出错,错误底层类型是*PathError.
第二个参数:文件打开模式(可以组合),第三个参数:权限控制(linux)

2)基本应用实例-方式一
(1)创建一个新文件,写入内容 5句"hello Gardon"
package main
import ("fmt""os""bufio"
)
func main(){//创建一个新文件,写入内容 5句"hello Gardon"//1.打开一个文件 "D:/test/test01/test.txt"filePath := "D:/test/test01/abc.txt"file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE,0666)if err != nil {fmt.Printf("open file err=%v",err)return}//及时关闭file句柄,防止内存泄露defer file.Close()//准备写入6句话str := "hello Gardon\r\n" // \r\n表示换行//写入时,使用带缓存的*writerwriter := bufio.NewWriter(file)for i := 0; i < 5; i++ {writer.WriteString(str)}//因为writer是带缓存的,因此在调用WriterString方法时,其实内存是先写入缓存的//所以需要调用Flush()方法,将缓存的数据//真正写入到文件中,否则文件中会没有数据writer.Flush()
(2)打开一个存在的文件中,将原来的内容覆盖成新的内容10句 “你好,爸爸"
package main
import ("fmt""os""bufio"
)
func main(){//打开一个存在的文件中,将原来的内容覆盖成新的内容10句 “你好,爸爸"//1.打开一个文件 "D:/test/test01/test.txt"filePath := "D:/test/test01/abc.txt"file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_TRUNC,0666)if err != nil {fmt.Printf("open file err=%v",err)return}//及时关闭file句柄,防止内存泄露defer file.Close()//准备写入10句话:你好,爸爸str := "你好,爸爸!\r\n" // \n 表示换行//写入时,使用带缓存的*writerwriter := bufio.NewWriter(file)for i := 0; i < 10; i++ {writer.WriteString(str)}//因为writer是带缓存的,因此在调用WriterString方法时,其实内存是先写入缓存的//所以需要调用Flush()方法,将缓存的数据//真正写入到文件中,否则文件中会没有数据writer.Flush()
}
(3)打开一个存在的文件,在原来的内容追加内容“ABCI ENGLISH!”
package main
import ("fmt""os""bufio"
)
func main(){//打开一个存在的文件,在原来的内容追加内容“ABCI ENGLISH!”//1.打开一个文件 "D:/test/test01/test.txt"filePath := "D:/test/test01/abc.txt"file, err := os.OpenFile(filePath,os.O_WRONLY | os.O_APPEND,0666)if err != nil {fmt.Printf("open file err=%v",err)return}//及时关闭file句柄,防止内存泄露defer file.Close()str := "ABCI ENGLISH!\r\n" // \n 表示换行//写入时,使用带缓存的*writerwriter := bufio.NewWriter(file)for i := 0; i < 10; i++ {writer.WriteString(str)}//因为writer是带缓存的,因此在调用WriterString方法时,其实内存是先写入缓存的//所以需要调用Flush()方法,将缓存的数据//真正写入到文件中,否则文件中会没有数据writer.Flush()
}
(4)打开一个存在的文件,将原来的内容读出显示在终端,并且追加"hello 北京"
package main
import ("fmt""os""bufio""io"
)
func main(){//打开一个存在的文件,将原来的内容读出显示在终端,并且追加"hello 北京"//1.打开一个文件 "D:/test/test01/abc.txt"//这是一个既要读又要写的操作filePath := "D:/test/test01/abc.txt"file, err := os.OpenFile(filePath,os.O_RDWR | os.O_APPEND,0666)if err != nil {fmt.Printf("open file err=%v",err)return}//及时关闭file句柄,防止内存泄露defer file.Close()//先读取原来文件的内容,并显示在终端reader := bufio.NewReader(file)for {str,err := reader.ReadString('\n')if err == io.EOF { //如果读到文件末尾break}//显示到终端fmt.Print(str)}
//写到文件中str := "hello 北京\r\n" // \n 表示换行//写入时,使用带缓存的*writerwriter := bufio.NewWriter(file)for i := 0; i < 5; i++ {writer.WriteString(str)}//因为writer是带缓存的,因此在调用WriterString方法时,其实内存是先写入缓存的//所以需要调用Flush()方法,将缓存的数据//真正写入到文件中,否则文件中会没有数据writer.Flush()
}
使用os.OpenFile(),bufio.NewWriter(),“Writer的方法WriteString完成上面的任务
3)基本应用实例-方式二
编写一个程序,将一个文件的内容,写入到另一个文件,注意:这两个文件已经存在了
说明:
1)使用ioutil.ReadFile /ioutil.WriteFile 完成文件的任务
package main
import ("fmt""io/ioutil"
)
func main(){//将D:/test/test01/abc.txt文件的内容导入到D:/test/test01/kkk.txt中//1.首先将D:/test/test01/abc.txt内容读取到内存filePath :="D:/test/test01/abc.txt"filePath2 :="D:/test/test01/kkk.txt"data, err := ioutil.ReadFile(filePath)if err != nil {//说明读取文件有错误fmt.Printf("read file err=%v\n",err)return }
//2.将读取到的内容写入:D:/test/test01/kkk.txt中err = ioutil.WriteFile(filePath2,data,0666)if err != nil {fmt.Printf("write file err=%v\n",err)}//会覆盖掉写入之后的文件中的所有内容}
5.判断文件是否存在
golang判断文件或文件夹是否存在的方法是使用os.Stat()函数返回的错误进行判断:
1)如果返回的错误为nil,说明文件或文件夹存在
2)如果返回的错误类型使用so.IsNotExist()判断为true,说明文件或文件夹不存在
3)如果返回的错误为其他类型,则不确定是否存在
//自己写了一个函数
func PathExists(path string)(bool,error){_,err :=os.Stat(path)if err == nil { //文件或目录存在return true,nil}if os.IsNotExist(err){return false,nil}return false,err
}
6.文件编程应用实例
拷贝文件
说明:将一张图片拷贝到另外一个目录下io包
func Copy (dst Writer,src Reader)(written int64,err error)
package main
import ("fmt""io""os""bufio"
)//自己写一个函数,接收两个文件路径 srcFileName dstFileName
func CopyFile(dstFileName string,srcFileName string)(written int64,err error){srcFile, err := os.Open(srcFileName)if err != nil {fmt.Println("open file err=%v\n",err)}//用完了需要关闭defer srcFile.Close()//通过srcFile,获取到Readerreader := bufio.NewReader(srcFile)//打开dstFileName :不能单纯地打开因为你不确定是否存在dstFile, err := os.OpenFile(dstFileName,os.O_WRONLY | os.O_CREATE,0666)if err != nil {fmt.Printf("open file err=%v\n",err)return}//通过dstFile,获取到writerwriter := bufio.NewWriter(dstFile)//用完了需要关闭defer dstFile.Close()return io.Copy(writer,reader)}
func main() {//将D:/test/dog.jpg拷贝到D:/test/test01/dog1.jpg//调用CopyFile完成文件的拷贝srcFile := "D:/test/dog.jpg"dstFile := "D:/test/test01/dog1.jpg"_, err :=CopyFile(dstFile,srcFile)if err == nil {fmt.Println("拷贝完成")} else {fmt.Printf("拷贝错误err=%v\n",err)}
}
6.统计英文、数字、空格和其他字符数量
说明:统计一个文件中含有的英文、数字-、空格及其它字符数量
package main
import ("fmt""os""io""bufio"
)
//定义个结构体,用于保存统计结构1
type CharCount struct {CharCount int //记录英文个数NumCount int //记录数字的个数SpaceCount int //记录空格的个数OtherCount int //记录其他字符的个数
}func main(){//思路:打开一个文件。创建一个Reader//每读取一行,就去统计该行有多少个 英文、数字、空格和其他字符//然后将它们保存到一个结构体当中
fileName := "D:/test/abc.txt"file, err := os.Open(fileName)if err != nil {fmt.Printf("open file err =%v\n",err)return}defer file.Close()//定义一个结构体实例var count CharCount//创建一个Rederreader := bufio.NewReader(file)//开始循环读取fileName的内容for {str,err :=reader.ReadString('\n')if err == io.EOF { //读到文件末尾break}//遍历str进行统计for _, v := range str {switch {case v >= 'a' && v <= 'z' :fallthrough //穿透处理case v >= 'A' && v <= 'A' :count.CharCount ++ case v == ' ' || v =='\t' :count.SpaceCount ++ case v >= '0' && v <='9' :count.NumCount ++ default :count.OtherCount ++ }}}//输出统计的结构fmt.Printf("字符的个数=%v,数字的个数=%v,空格的个数=%v,其他字符的个数=%v",count.CharCount,count.NumCount,count.SpaceCount,count.OtherCount)
}
二、命令行参数
有一个需求
我们希望能够获取到命令行输入的各种参数,该如何处理?如下,我们执行一个可执行文件并附带一个参数
D:\myfile\GO\project\src\go_code\exec\count\main> test.exe tom c:/aa/bb/config.init 88
1.使用os.Args对参数进行解析
基本介绍
os.Args是一个string的切片,用来存储所有的命令行参数
应用案例
请编写一段代码,可以获取命令行的各种参数
package main
import ("fmt""os"
)func main() {fmt.Println("命令行的参数值",len(os.Args))//遍历os.Args切片,就可以得到所有命令行输入的参数值for i,v :=range os.Args {fmt.Printf("Args[%v]=%v\n",i,v)}
}
使用go build去编译一个可执行文件test.exe进行测试

2.flag包解析命令行参数
flag包用来解析命令行参数
说明:前面的方式是比较原生的方式,对解析参数不是特别的方便,特别是带有指定参数形式的命令行
比如:cmd>main.exe -f C:/aaa.txt -p 200 -u root 这样的命令行,go设计者给我们提供了flag包,,可以方便的解析命令行参数,而且参数顺序可以随意
请编写一段代码,可以获取命令行的各个参数
package main
import ("fmt""flag"
)
func main() {//定义几个变量,用于接收命令行的参数值var user stringvar pwd stringvar host stringvar port int//&user 就是接收用户命令行中输入的-u后面的参数//"u",就是-u 指定参数//"",默认值//"用户名,默认为空" 说明flag.StringVar(&user,"u","","用户名,默认为空")flag.StringVar(&pwd,"pwd","","密码,默认为空")flag.StringVar(&host,"h","localhost","主机名,默认为localhost")flag.IntVar(&port,"port",3306,"端口号默认为3306")//这里有一个非常重要的操作,转换,必须调用该方法flag.Parse()//输出结果fmt.Printf("user=%v pwd=%v host=%v port=%v",user,pwd,host,port)}
测试结果

将顺序打乱或者不传参数再次进行测验

相关文章:
go学习之文件操作与命令行参数
文章目录 一、文件操作1.基本介绍2.常用文件操作函数和方法3.关于文件操作应用实例4.写文件操作应用实例(创建文件并写入文件)1)基本介绍2)基本应用实例-方式一 5.判断文件是否存在6.统计英文、数字、空格和其他字符数量 二、命令…...
面试题:海量PDF的OCR处理思路
关键点: 1000wPDF:数据量非常大。3天处理完:有时间限制。一篇PDF1~10s:可能需要以最高10s去做计算,这样时间才能保证留有富余。要求资源最大化利用:也就是尽可能节省服务器资源,能复用尽量复用&…...
[原创][2]探究C#多线程开发细节-“线程的无顺序性“
[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…...
【精选】Spring整合MyBatis,Junit 及Spring 事务Spring AOP面向切面详解
Spring整合MyBatis 搭建环境 我们知道使用MyBatis时需要写大量创建SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession等对象的代码,而Spring的作用是帮助我们创建和管理对象,所以我们可以使用Spring整合MyBatis,简化MyBatis开发。 …...
获取Spring容器Bean工具类
获取Spring容器Bean工具类 1、创建SpringUtils工具类2、注册 SpringUtils工具类3、如果打包的是War方式,可能上面两个注册工具类的方法都没用 1、创建SpringUtils工具类 public class SpringUtils implements ApplicationContextAware {private static Application…...
图面试专题
一、概念 和二叉树的区别:图可能有环 常见概念 顶点(Vertex): 图中的节点或点。边(Edge): 顶点之间的连接线,描述节点之间的关系。有向图(Directed Graph)&…...
VUE的计算属性
<!DOCTYPE html> <html> <head> <meta charset"UTF-8" /> <title>计算属性</title> </head> <style> table { border: 1px solid #000; text-align: center; width: 240px; } th,td { border: 1px solid #000; …...
uniapp中使用pageScrollTo让页面滚动到固定节点或距离
uniapp中使用pageScrollTo让页面滚动到固定节点或距离 思路:计算当前节点距离顶部的距离滚动距离然后使用pageScrollTo进行滚动(要保证页面加载完成之后在执行) #topic" id :页面的节点 changeTop(id) {let query uni.c…...
使用机器学习方法进行分析和处理:对高质量图像进行压缩
使用SVD(奇异值分解)进行图像压缩与普通压缩工具压缩的主要区别在于压缩原理和压缩效果。 压缩原理: 普通图像压缩工具通常采用有损压缩或无损压缩算法,如JPEG、PNG等,它们主要针对图像的像素进行变换和编码。而SVD图像…...
多线程面试总结
1. 创建线程有哪几种方式 创建线程有三种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。 通过继承Thread类来创建并启动线程的步骤如下: 定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行…...
android11-隐藏状态栏和导航栏
隐藏导航栏 /android11/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml diff --git a/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml b/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml index ba6b6956f1..6db2348…...
血的教训--kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】
血的教训–kail系统免密centos7的坑【高版本ssh免密低版本ssh的坑】 最近下载了一个2023版本的kail系统,但是经过几次设置免密后,ssh过去一直让提供密码,所以就仔细的分析了一下,果然还是发现了点猫腻 接上一个博客,大…...
javaagent字节码增强浅尝
概述 javaagent 技术广泛应用于对代码的增强,比如统计方法执行时间、GC 信息打印、分布式链路跟踪等;实现方式包括 javassist 和 bytebuddy,bytebuddy 是对 javassist 的改进;类似于 spring 中的 AOP; Instrumentati…...
计算机组成原理-Cache替换算法
文章目录 总览随机算法(RAND)先进先出算法(FIFO)近期最少使用算法(LRU)最不经常使用算法(LFU)总结 总览 随机算法(RAND) 没有选择性地考虑替换哪一块Cache&a…...
Adobe 家族系列download
adobe 前言 Adobe公司的产品线中拥有多个家族桶,下面是Adobe全家桶产品的功能介绍: Creative Cloud(创意云):包含Photoshop、Illustrator、InDesign、Premiere Pro、After Effects、Lightroom等创意设计、视频制作和…...
97.STL-查找算法 find
目录 STL-查找算法find 1.基本用法: 2.查找自定义类型: 3.查找范围: STL-查找算法find 在C的STL(标准模板库)中,find 算法用于在指定范围内查找指定值的元素。 功能描述: 查找指定元素&…...
如何应对雨天飞行的挑战?无人机机库防护能力解析
一、 背景介绍 无人机机库是无人机停放和起降场所,类似传统飞机的 hangar(飞机库)。它是一个专门用于存储、维护和保护无人机的设施。无人机机库的存在有助于提高无人机的安全性,同时也为无人机提供了一个有序的管理场所。 雨天…...
机器学习笔记 - 3D数据的常见表示方式
一、简述 从单一角度而自动合成3D数据是人类视觉和大脑的基本功能,这对计算机视觉算法来说是比较难的。但随着LiDAR、RGB-D 相机(RealSense、Kinect)和3D扫描仪等3D传感器的普及和价格的降低,3D 采集技术的最新进展取得了巨大飞跃。与广泛使用的 2D 数据不同,3D 数据具有丰…...
【Node.js】解决npm报错:RequestError: unable to verify the first certificate
1. 问题简述 帖主从nodejs官网下载安装nodejs后,发现使用以下命令安装electron会报错: npm install electron 报错信息如下: npm ERR! RequestError: unable to verify the first certificate 2. 解决方案 网上列举的方案,无…...
语言模型文本处理基石:Tokenizer简明概述
编者按:近年来,人工智能技术飞速发展,尤其是大型语言模型的问世,让 AI 写作、聊天等能力有了质的飞跃。如何更好地理解和利用这些生成式 AI,成为许多开发者和用户关心的问题。 今天,我们推出的这篇文章有助…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
