2022-5-19 实习Day40
1、gpi299报文发送问题,报文结构有误 –2小时 100%
2、新的行内汇款(选费用)提交报错排查(手续费配置多条) –3小时 100%
3、机构内部账根据币种、机构号、账号代码执行逻辑反馈 –1小时 100%
Golang编程学习(part 35)
1、文件I/O基本介绍
① 输入和输出流
文件在程序中是以流的形式来操作的
1 2 3 4 5
| |————————————| 输入流【读文件】 |————————————| | Go程序 |<————————————————————------------------------------| 文件 | | | 输出流【写文件】 | | | (内存) |————————————————————------------------------------>| (硬盘) | |————————————| |————————————|
|
② os.File封装所有文件相关操作,File是一个结构体

2、打开文件和关闭文件
① 使用的函数和方法
1 2 3 4 5
| func Open(name string) (file *File, err error)
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY 模式。如果出错,错误底层类型是*ParhError
|
1 2 3 4
| func (f *File) Close() error
Close关闭文件f,使得文件不能用于读写。它返回可能出现的错误
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package main
import ( "fmt" "os" )
func main() { file, err := os.Open("D:\\桌面\\txx.txt") if err != nil { fmt.Println("open file err=", err) return }
fmt.Printf("file=%v", file)
err = file.Close() if err != nil { fmt.Println("close file err", err) } }
|
3、读文件操作应用实例
① 读文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Close,bufio.NewReader(),reader.ReadString函数和方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package main
import ( "bufio" "fmt" "io" "os" ) func main() { file, err := os.Open("D:/桌面/txx.txt") if err != nil { fmt.Println("open file err=", err) return }
defer file.Close() const defaultBufSize = 4096 reader := bufio.NewReader(file)
for true { str, err := reader.ReadString('\n') fmt.Print(str) if err == io.EOF { break }
} fmt.Println("文件读取结束......") }
|
② 读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况。相关方法和函数(ioutil.ReadFile)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package main
import ( "fmt" "io/ioutil" )
func main() { file := "D:/桌面/txx.txt" content, err := ioutil.ReadFile(file) if err != nil { fmt.Printf("read file err=%v", err) }
fmt.Printf("%v", content) fmt.Println() fmt.Printf("%v", string(content))
}
|
4、写文件操作应用实例
① 基本介绍 —— os.OpenFile函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
|
② 基本应用实例 — 方式一
1) 创建一个新文件,写入内容5句 “hello, Gardon”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| package main import ( "bufio" "fmt" "os" ) func main() { file, err := os.OpenFile("D:/桌面/txx.txt", os.O_WRONLY|os.O_CREATE, 0666) if err != nil { fmt.Printf("open file err=%v\n", err) return }
defer file.Close() str := "hello, Gardon\n"
writer := bufio.NewWriter(file) for i := 0; i < 5; i++ { writer.WriteString(str) }
writer.Flush() }
|
2)打开一个存在的文件,将原来的内容覆盖成新的内容,10句”你好,世界”(会先清空再添加内容)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| func main() { filePath := "D:/桌面/txx.txt" file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_TRUNC, 0666) if err != nil { fmt.Printf("open file err=%v\n", err) return }
defer file.Close()
str := "你好,世界" writer := bufio.NewWriter(file) for i := 0; i < 10; i++ { writer.WriteString(str) }
writer.Flush() }
|
③ 基本应用实例 — 方式二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
func main() { file1 := "D:/桌面/aaa.txt" file2 := "D:/桌面/bbb.txt" readFile, err := os.ReadFile(file1) if err != nil { fmt.Printf("read file err=%v\n", err) return } err = os.WriteFile(file2, readFile, 0666) if err != nil { fmt.Printf("write file error=%v\n", err) }
}
|
④ 判断文件是否存在
Golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断:
1)如果返回的错误为nil,说明文件或文件夹存在
2)如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
3)如果返回的错误为其他类型,则不确定是否存在
1 2 3 4 5 6 7 8 9 10 11 12 13
| func PathExists(path string) (bool, error) { stat, err := os.Stat(path) fmt.Println(stat) if err == nil { return true, nil }
if os.IsExist(err) { return false, err } return false, err }
|