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,成为许多开发者和用户关心的问题。 今天,我们推出的这篇文章有助…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...