go语言学习——8

news/2024/9/20 11:44:45

文章目录

  • 文件操作
    • 打开文件
    • 文件读取
    • 写文件
    • 判读文件或文件夹是否存在
    • 拷贝文件
    • 统计文件字符
    • 命令行参数
    • flag包解析命令行参数

文件操作

os.File封装所有文件相关操作,File是一个结构体

打开文件

在这里插入图片描述

package mainimport ("fmt""os"
)func main() {file,err:=os.Open("test/test.txt")if err!=nil{fmt.Println("open file err=",err)}fmt.Printf("file=%v\n",file)err=file.Close()if err!=nil{fmt.Println("close file err=",err)}}//open file err= open test.txt: The system cannot find the file specified.
// file=<nil>
// close file err= invalid argument//自行创建文件之后
//file=&{0xc0000c2780}

文件读取

package mainimport ("bufio""fmt""io""os"
)func main() {file,err:=os.Open("test/test.txt")if err!=nil{fmt.Println("open file err=",err)}defer file.Close()reader:=bufio.NewReader(file)for{str,err:=reader.ReadString('\n')fmt.Print(str)if err==io.EOF{//io.EOF表示文件的末尾break}}fmt.Println()fmt.Println("文件读取结束。。。")
}
//123
//123
//文件读取结束。。。

使用ioutil一次将整个文件读入内存中,这种方法适用于文件不大的情况

package mainimport ("fmt""io/ioutil"
)func main() {content,err:=ioutil.ReadFile("test/test.txt")if err!=nil{fmt.Printf("read file err=%v\n",err)}fmt.Println(content)//[]bytefmt.Printf("%v",string(content))}
//[49 50 51 13 10 49 50 51]
//123
//123

写文件

在这里插入图片描述

package mainimport ("bufio""fmt""os"
)func main() {file,err:=os.OpenFile("test/a.txt",os.O_WRONLY | os.O_CREATE,0666)if err!=nil{fmt.Printf("open file err=%v",err)return}defer file.Close()str:="hello,world!\n"writer:=bufio.NewWriter(file)for i:=0;i<5;i++{writer.WriteString(str)}//先写到缓存,需要调用Flush方法,将缓冲的数据真正写入到文件中,否则文件没有数据writer.Flush()
}

示例:将一个文件的内容写入到另一个文件
注意:这两个文件都已经存在了

package mainimport ("fmt""io/ioutil"
)func main() {content1,err:=ioutil.ReadFile("test/a.txt")if err!=nil{fmt.Printf("read file err=%v",err)return}err2:=ioutil.WriteFile("test/b.txt",content1,0666)if err2!=nil{fmt.Printf("write file err=%v",err)}
}

判读文件或文件夹是否存在

os.Stat()函数返回的错误值

  • nil,文件或文件夹存在
  • os.IsNotExist()判断为true,说明文件夹不存在
  • 如果返回的错误为其他类型,不确定是否存在
package mainimport ("fmt""os"
)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
}func main() {paths:=[]string{"test/test.go","test/a.txt","test/test/"}for _,v:=range paths{b,e:=PathExists(v)fmt.Printf("bool=%v,err=%v\n",b,e)}}
//bool=false,err=<nil>
//bool=true,err=<nil>
//bool=false,err=<nil>

拷贝文件

// filecopy.go
package mainimport ("fmt""io""os"
)func main() {CopyFile("target.txt", "source.txt")fmt.Println("Copy done!")
}func CopyFile(dstName, srcName string) (written int64, err error) {src, err := os.Open(srcName)if err != nil {return}defer src.Close()dst, err := os.OpenFile(dstName, os.O_WRONLY|os.O_CREATE, 0644)if err != nil {return}defer dst.Close()return io.Copy(dst, src)
}

统计文件字符

package mainimport ("bufio""fmt""io""os"
)type CharCount struct {ChCount int//英文个数NumCount int//数字个数SpaceCount int//空格个数OtherCount int//其他字符个数
}func main() {
//	打开文件,创建Reader,
//	每读取一行,就去统计该行有多少个英文、数字、空格和其他字符fileName:="test/file_IsExist.go"file,err:=os.Open(fileName)if err!=nil{fmt.Printf("open file err=%v\n",err)return}defer file.Close()var cout CharCountreader:=bufio.NewReader(file)
//	循环读取for{str,err:=reader.ReadString('\n')if err == io.EOF{break}//为了兼容中文字符,可以将str转成[]rune//str=[]rune(str)for _,v:=range str{switch {case v>='a' && v<='z':fallthrough//穿透case v>='A' && v<='Z':cout.ChCount++case v==' ' && v=='\t':cout.SpaceCount++default:cout.OtherCount++}}}fmt.Println(cout)
}
//{227 0 0 146}

命令行参数

在这里插入图片描述

os.Args是一个string的切片,用来存储命令行参数

//file_args.go
package mainimport ("fmt""os"
)func main() {fmt.Println("命令行参数数量:",len(os.Args))for i,v:=range os.Args{fmt.Printf("args[%v]=%v\n",i,v)}
}

先编译,后执行
在这里插入图片描述

flag包解析命令行参数

前面的方法是比较原生的方式,解析参数不是特别的方便,特别是带有指定参数形式的命令行
flag包,可以更加方便的解析命令行参数,而且参数顺序可以随意

//file_flag.go
package mainimport ("flag""fmt"
)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\n",user,pwd,host,port)
}

在这里插入图片描述


https://dhexx.cn/news/show-4633876.html

相关文章

数组扁平化的8种方法 - js篇

文章目录 方式1&#xff1a;使用基础的递归遍历方式2&#xff1a;使用reduce函数递归遍历方式3&#xff1a;数组强制类型转换方式4&#xff1a;while循环结合findIndex与concat方式5&#xff1a;直接使用ES6的flat方法方式6&#xff1a;使用JSON的函数和正则表达式方式7&#x…

2个月过去了,面试至今0 offer,这是怎么了?

转眼已是6月初&#xff0c;求职招聘季也结束啦&#xff0c;如果没点真技术、真本事&#xff0c;不了解点职场套路&#xff0c;在今年行情下&#xff0c;找工作可是难上加难。 现在点开微博或者脉脉&#xff0c;只要搜索“招聘”&#xff0c;用“惨不忍睹”来形容也不为过。不少…

二、电压源、电流源、受控源

点我回到目录 目录 理想电压源 理想电流源 受控源 电流源做功问题 电压源做功问题 理想电压源 •定义&#xff1a;两端电压保持定值或一定的时间函数&#xff0c;且电压值与流过它的电流i无关 •特点&#xff1a;理想电压源两端的电压由本身决定&#xff0c;与外电路无关…

简单聊一聊数据库驱动

数据库驱动通常是数据库厂家提供的&#xff0c;他们按照jdbc协议对自家数据库封装了一套可对外调用的API。在应用程序和数据库之间起到了桥接的作用。它是一个软件组件&#xff0c;提供了与特定数据库系统进行通信的接口和功能。 1. 数据库驱动的作用&#xff1a; 连接数据库&…

非常简单就能理解的 链表带环问题 你也能轻松学会!

文章目录 判断链表是否带环若链表带环找出环的入口其他高频的面试问题 判断链表是否带环 题目描述&#xff1a; 给定一个链表&#xff0c;判断链表中是否有环。 思路&#xff1a; 可以明确的是&#xff1a;若一个链表带环&#xff0c;那么用指针一直顺着链表遍历&#xff0c…

集成测试方法详细教程及实现方法

集成测试是一种软件测试方法&#xff0c;用于验证不同组件、模块或系统之间的交互和集成。它的目标是检测和解决在组件集成过程中可能出现的问题&#xff0c;确保各个组件在协同工作时正常运行。 具体来说&#xff0c;集成测试关注以下几个方面&#xff1a; 1. 接口测试&#x…

【linux下一次复制cp多个文件】

linux下一次复制cp多个文件 linux cp 参数说明 -a&#xff1a;此选项通常在复制目录时使用&#xff0c;它保留链接、文件属性&#xff0c;并复制目录下的所有内容。其作用等于dpR参数组合。 -d&#xff1a;复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。 -f&…

nginx系统优化和内核优化

nginx系统优化 一&#xff1a;隐藏nginx版本号 方法一&#xff1a;修改配置文件 vim /usr/local/nginx/conf/nginx.confnginx -t systemctl restart nginx curl -I http://192.168.52.108方法二&#xff1a;修改源代码 vim /opt/nginx-1.24.0/src/core/nginx.h ##配置文件里…

Yolov8轻量级:Next-vit,用于现实工业场景的下一代视觉 Transformer

1.Next-vit介绍 论文:https://arxiv.org/pdf/2207.05501.pdf 由于复杂的注意力机制和模型设计,大多数现有的视觉 Transformer(ViT)在现实的工业部署场景中不能像卷积神经网络(CNN)那样高效地执行。这就带来了一个问题:视觉神经网络能否像 CNN 一样快速推断并像 ViT 一样…

【嵌入式烧录/刷写文件】-2.9-Intel Hex文件的地址对齐Address Alignment

案例背景(共5页精讲): 对一个Intel Hex文件&#xff0c;进行地址对齐Address Alignment。 目录 1 为什么要进行“地址对齐Address Alignment” 1.1 “对齐长度”的选择 2 使用Vector HexView工具对Hex文件进行“地址对齐Address Alignment” 2.1 “自动”完成“地址对齐Ad…