Golang 获取命令行携带的参数丶文件操作
一.获取命令行携带的参数
1 /* 获取命令执行携带的参数 */ 2 func TestGetCMDParameter() { 3 /* 4 os.Args就是运行时携带的参数. 5 os.Args是一个切片 6 第一个是主程序的名称 7 8 测试: 9 1.编译 go buil main.go 10 2.运行 ./main -h localhost -p 1234 -P 0000 -u root 11 */ 12 for index, val := range os.Args { 13 index++ 14 fmt.Printf("第%v个参数=%v ", index, val) 15 } 16 17 // 进行过处理的args 18 var user string 19 var host string 20 var passwd string 21 var port int 22 23 flag.IntVar(&port, "p", 6379, "提醒用户,默认端口为6379.") 24 flag.StringVar(&host, "h", "", "提醒用户,默认主机名空.") 25 flag.StringVar(&user, "u", "", "提醒用户,默认用户为空.") 26 flag.StringVar(&passwd, "P", "", "提醒用户,默认密码为空.") 27 28 // 必须调用该方法才会转换 29 flag.Parse() 30 31 fmt.Printf("\nhost=%v, port=%v, user=%v, passwd=%v \n", host, port, user, passwd) 32 }
二.文件操作
1 func TestFile() { 2 /* 3 使用细节: 4 1.file变量是指针类型 5 2.所有的文件读写操作都基于file结构体 6 3. 7 */ 8 // 文件的打开和关闭 9 FileOpenClose := func(filename string) { 10 file, err := os.Open(filename) 11 if err != nil { 12 fmt.Println("open file error ! ", err) 13 return 14 } 15 err = file.Close() 16 if err != nil { 17 fmt.Println("close file error ! ", err) 18 return 19 } 20 } 21 // 读文件 *Reader 带缓冲的读数据.默认缓冲大小为4096个字节(NewReader) 22 FileReadBuf := func(filename string) { 23 file, err := os.Open(filename) 24 if err != nil { 25 fmt.Println("open file error ! ", err) 26 return 27 } 28 defer file.Close() 29 30 reader := bufio.NewReader(file) 31 for { 32 context, err := reader.ReadString('\n') // 读取到换行符就返回 33 34 if err == io.EOF { 35 fmt.Println("注意这里,带结尾符的内容:", context) 36 break 37 } 38 fmt.Printf(context) 39 40 } 41 42 } 43 // 一次性将文件内容读取出来.只适用文件不大的情况 ioutil.ReadFile (好象现在过时了) 44 FileRead := func(filename string) { 45 // 文件的打开和关闭都在ReadFile中处理了 46 bytes, err := ioutil.ReadFile(filename) 47 if err != nil { 48 fmt.Println("open file error ! ", err) 49 return 50 } 51 fmt.Println(string(bytes)) 52 } 53 // 写文件.以具体模式打开文件 54 FileWriteOpenFile := func(filename string, context []string) { 55 /* 56 const ( 57 // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified. 58 O_RDONLY int = syscall.O_RDONLY // open the file read-only. 59 O_WRONLY int = syscall.O_WRONLY // open the file write-only. 60 O_RDWR int = syscall.O_RDWR // open the file read-write. 61 // The remaining values may be or'ed in to control behavior. 62 O_APPEND int = syscall.O_APPEND // append data to the file when writing. 63 O_CREATE int = syscall.O_CREAT // create a new file if none exists. 64 O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist. 65 O_SYNC int = syscall.O_SYNC // open for synchronous I/O. 66 O_TRUNC int = syscall.O_TRUNC // truncate regular writable file when opened. 67 ) 68 linux下,第三个参数为文件权限,创建新文件的时候有关 69 */ 70 file, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.FileMode(666)) 71 if err != nil { 72 fmt.Println("open file error ! ", err) 73 return 74 } 75 defer file.Close() 76 // 带缓冲写文件 77 writer := bufio.NewWriter(file) 78 for _, val := range context { 79 fmt.Println(val) 80 _, err := writer.WriteString(val) 81 if err != nil { 82 fmt.Println("write file error ! ", err) 83 break 84 } 85 86 } 87 // 带缓冲的writer是先将数据写入缓存的,所以需要调用Flush将缓冲的数据真正写入到文件中去 88 writer.Flush() 89 } 90 // 判断文件是否存在 91 FileExists := func(filename string) (bool, error) { 92 /* 93 os.Stat 返回的FileInfo变量包含了文件的详细信息 94 type FileInfo interface { 95 Name() string // base name of the file 96 Size() int64 // length in bytes for regular files; system-dependent for others 97 Mode() FileMode // file mode bits 98 ModTime() time.Time // modification time 99 IsDir() bool // abbreviation for Mode().IsDir() 100 Sys() any // underlying data source (can return nil) 101 } 102 */ 103 finfo, err := os.Stat(filename) 104 if err == nil { 105 return true, nil 106 } 107 fmt.Println(finfo) 108 if os.IsNotExist(err) { 109 return false, nil 110 } 111 return false, err 112 } 113 // 复制文件 114 FileCopy := func(desFileName string, srcFileName string) (written int64, err error) { 115 // 1.先获取src的file对象 116 srcFile, err := os.Open(srcFileName) 117 if err != nil { 118 fmt.Printf("Open '%v' error! %v\n", srcFileName, err) 119 return 120 } 121 defer srcFile.Close() // 记得关闭文件 122 // 2.用src的file对象获取带缓冲的Reader,好配合Writer实现Copy 123 reader := bufio.NewReader(srcFile) 124 125 // 3.des的file对象 126 desFile, err := os.OpenFile(desFileName, os.O_CREATE|os.O_WRONLY, 0666) 127 if err != nil { 128 fmt.Printf("Open '%v' error! %v\n", desFileName, err) 129 return 130 } 131 defer desFile.Close() 132 // 4.用des的file对象获取带缓冲的Writer,好配合Reader实现Copy 133 writer := bufio.NewWriter(desFile) 134 135 // 5.最终调用Copy. 如果目标文件夹不存在的话会报错 136 written, err = io.Copy(writer, reader) 137 return 138 } 139 140 filename := "./data.json" 141 FileOpenClose(filename) 142 FileReadBuf(filename) 143 FileRead(filename) 144 FileWriteOpenFile(filename, []string{"1hell"}) 145 if ok, err := FileExists(filename); !ok { 146 if err != nil { 147 fmt.Println("获取文件信息异常!", err) 148 } else { 149 fmt.Println("文件不存在!") 150 } 151 } 152 if _, err := FileCopy("./test.json", filename); err != nil { 153 fmt.Println("文件Copy错误!", err) 154 } 155 }