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,成为许多开发者和用户关心的问题。 今天,我们推出的这篇文章有助…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...