学习资料来自
GitHub – unknwon/the-way-to-go_ZH_CN: 《The Way to Go》中文译本,中文正式名《Go 入门指南》
数据读写(标准输入/出 os.Stdin / os.Stdout :本质是*os.File类型)
1、输入(才发现,学和写了一段时间go,居然连输入都没有好好了解过🤦♀️)
1)fmt 包
(1)fmt.Scanln :空格分隔值依次存入后续参数,直至换行
fmt.Scanln(&firstName, &lastName)
(2)fmt.Scanf :与Scanln类似,但第一个参数用于指定输入格式
(3)fmt.Sscanf 和 fmt.Sscanln :与1)2)类似,但不是从标准输入读取,是从给定的字符串读取
2)bufio 包(提供缓冲)
// 键盘读取输入,直到换行
var inputReader *bufio.Reader
var input string
var err error
func main() {
inputReader = bufio.NewReader(os.Stdin)
fmt.Println("Please enter some input: ")
input, err = inputReader.ReadString('\n')
if err == nil {
fmt.Printf("The input was: %s\n", input)
}
}
文件读写(os.File)
1、读文件
1)普通读文件
// 打开文件
inputFile, inputError := os.Open("input.dat") // 默认只读模式打开
// 判断文件是否正确打开
if inputError != nil {
fmt.Printf("An error occurred on opening the inputfile\n"
+"Does the file exist?\n"
+"Have you got access to it?\n")
return // exit the function on error
}
// defer保证程序结束时,文件关闭
defer inputFile.Close()
// 针对打开的文件,创建读取器
inputReader := bufio.NewReader(inputFile)
for {
// 按行读取文件
// ReadString和ReadBytes不需要关心操作系统结束符直接\n,也可用 ReadLine()
inputString, readerError := inputReader.ReadString('\n')
fmt.Printf("The input was: %s", inputString)
// 判断是否读取到文件末尾
if readerError == io.EOF {
return
}
}
2)完整文件读取到字符串中(io/ioutil包,ioutil.ReadFile()方法)
inputFile := "products.txt"
outputFile := "products_copy.txt"
// buf 为 []byte 类型
buf, err := ioutil.ReadFile(inputFile)
if err != nil {
fmt.Fprintf(os.Stderr, "File Error: %s\n", err)
}
fmt.Printf("%s\n", string(buf))
// 输出,写入指定文件
err = ioutil.WriteFile(outputFile, buf, 0644) // oct, not hex
if err != nil {
panic(err.Error())
}
3)二进制文件或内容并不按行划分 :使用 bufio.Reader 中的 Read() 函数
- 参数:一个,[]byte类型
- 返回值:两个,读取到的字节数,错误信息
4)按列读取文件
// 将file中的3列数据分别读入 v1,v2和v3
_, err := fmt.Fscanln(file, &v1, &v2, &v3)
5)读取压缩文件:compress 包,支持文件格式 bzip2、flate、gzip、lzw 和 zlib。打开文件后使用 “格式.NewReader(文件符)”,构建缓冲进行读取,格式类似 bufio.NewReader(文件符)
—
2、写文件
1)缓冲区写文件
// ----------打开文件
outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666)
// 文件权限 ,写文件时不管Win或Unix均使用 0666
// os.O_RDONLY:只读
// os.O_WRONLY:只写
// os.O_CREATE:创建:如果指定文件不存在,就创建该文件。
// os.O_TRUNC:截断:如果指定文件已存在,就将该文件的长度截为 0 。
// ----------创建写入器(缓冲区)对象
outputWriter := bufio.NewWriter(outputFile)
// ----------字符串写入缓冲区
outputWriter.WriteString(outputString)
// 缓冲区内容写入文件
outputWriter.Flush()
2)fmt包中的函数,打开文件outputFile后,将字符串直接写入文件: fmt.Fprintf(outputFile, “Some test data.\n”)
3)其他写入,打开文件outputFile后直接写入:outputFile.WriteString(“hello, world in a file\n”)
3、拷贝文件使用 io 包
// 1)读方式打开源文件 src
// 2)写/创建方式打开目标文件 dst
// 3)执行拷贝
io.Copy(dst, src)
补:
// 根据当前路径获取文件名
import "path/filepath"
filename := filepath.Base(path)
命令行读写
1)os包:string类型的切片变量 os.Args,处理基本命令行参数,程序启动后自动读取命令行输入的参数(类似C++中main的命令行参数数组)
2)flag包
- flag.PrintDefaults():打印help信息
- flag.Bool():默认值flase的flag,在命令行出现了第一个参数->flag为true
- flag.Parse():扫描参数列表+设置flag
- flag.Narg():返回参数的数量
- flag.Arg(i):第 i 个参数(flag.Arg(0)放置参数1,os.Args(0)放置程序名)
使用举例
flag.PrintDefaults()
flag.Parse()
var s string = ""
for i := 0; i < flag.NArg(); i++ {
s += flag.Arg(i)
}
os.Stdout.WriteString(s)