Golang 获取命令行携带的参数丶文件操作

发布时间 2023-09-16 10:14:48作者: 看一百次夜空里的深蓝

一.获取命令行携带的参数

 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 }