• golang之终端操作,文件操作


    终端操作

    操作终端相关的文件句柄常量
    os.Stdin:标准输入
    os.Stdout:标准输出
    os.Stderr:标准错误输出

    关于终端操作的代码例子:

    package main
    
    import "fmt"
    
    func main() {
        var (
            firstName, lastName, s string
            i                      int
            f                      float32
            input                  = "52.22/2334/go"
            format                 = "%f/%d/%s"
        )
        fmt.Println("Please input your name")
        //fmt.Scanf("%s %s", &firstName, &lastName)
        fmt.Scanln(&firstName, &lastName) //和上一句的效果相同
    
        fmt.Printf("Hi %s %s
    ", firstName, lastName)
        fmt.Sscanf(input, format, &f, &i, &s)
        fmt.Println("From the string we read are
    ", f, i, s)
    }

    关于带缓冲区的读写

    这里需要用到一个包:bufio

    下面是代码例子:

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
    )
    
    var inputReader *bufio.Reader
    var input string
    var err error
    
    func main() {
        inputReader = bufio.NewReader(os.Stdin)
        fmt.Println("Please input some words")
        //// 下面这个表示我们读取一行,最后是以
     为分割的,
    表示换行
        input, err = inputReader.ReadString('
    ')
        if err != nil {
            fmt.Printf("error:", err)
            return
        }
        fmt.Printf("the input was:%s
    ", input)
    }

    练习终端操作

    从终端读取一行字符串,统计英文,数字,空格以及其他字符的数量
    代码实现:

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
    )
    
    func judge(str string) {
        var countNum, countLetter, countSpace, countOther int
        for _, v := range str {
            if v >= 'a' && v <= 'z' || v >= 'A' && v <= 'Z' {
                countLetter++
            } else if v >= '0' && v <= '9' {
                countNum++
            } else if v == ' ' {
                countSpace++
            } else {
                countOther++
            }
        }
        fmt.Printf("字母的数量是:%d
    ", countLetter)
        fmt.Printf("数字的数量是:%d
    ", countNum)
        fmt.Printf("空格的数量是:%d
    ", countSpace)
        //之所以-1,是因为多算了一个换行符
    
        fmt.Printf("其他字符的数量是:%d
    ", countOther-1)
    }
    func main() {
        var inputReader *bufio.Reader
        inputReader = bufio.NewReader(os.Stdin)
        str, err := inputReader.ReadString('
    ')
        if err != nil {
            fmt.Println(err)
            return
        }
        judge(str)
    }

    关于文件读写

    os.File封装所有文件相关的操作

    打开一个文件进行读操作:os.Open(name string)(*File,error)
    关闭一个文件:File.Close()

    关于文件操作的一个简单例子:

    package main
    
    import (
        "bufio"
        "fmt"
        "io"
        "os"
    )
    
    func main() {
        //注意这里文件地址需要用双引号
        file, err := os.Open("/Users/myname/learngo/src/go_dev/day06/bufio/bufio.go")
        if err != nil {
            fmt.Println("open file err:", err)
            return
        }
        //注意这里defer关闭文件
        defer file.Close()
        inputReader := bufio.NewReader(file)
        i := 0
        for {
            inputString, readErr := inputReader.ReadString('
    ')
            if readErr == io.EOF { //表示读取到文件末尾
                return
            }
            i++ //行数
            //打印每行的行号和内容
            fmt.Printf("%d %s
    ", i, inputString)
        }
    }

    上面例子中关于读文件是一行一行的读的,下面我们也可以一次性读完整的文件,但是切记如果文件过大,这种方法不适用,这里用到是io/ioutil包

    package main
    
    import (
        "fmt"
        "io/ioutil"
    )
    
    func main() {
        buff, err := ioutil.ReadFile("/Users/myname/learngo/src/go_dev/day06/bufio/bufio.go")
        if err != nil {
            fmt.Println("read file error:", err)
            return
        }
        fmt.Printf("the content of file is:%s
    ", string(buff))
    }

    关于读取压缩文件的例子,这里用到的是compress/gzip包

    package main
    
    import (
        "bufio"
        "compress/gzip"
        "fmt"
        "io"
        "os"
    )
    
    func main() {
        //注意这里的压缩文件需要使gzip -k xxx,-k意思是保留源文件
        file, err := os.Open("/Users/myname/learngo/src/go_dev/day06/gzip/bufio.go.gz")
        if err != nil {
            fmt.Println("open file err:", err)
            return
        }
        defer file.Close()
    
        reader, err := gzip.NewReader(file)
        if err != nil {
            fmt.Println("gzip file err:", err) //如果不是.gz文件,则gzip: invalid header
            return
        }
        bfreader := bufio.NewReader(reader)
    
        for {
            line, err := bfreader.ReadString('
    ')
            if err != nil {
                if err == io.EOF {
                    break
                }
                fmt.Println("read file err:", err)
                break
            }
            fmt.Printf("%s
    ", line)
        }
    }

    关于文件的写入

    os.OpenFile("filename",os.O_WRONLY|os.O_CREATE,066)

    第一个参数是文件名
    第二个参数是文件的打开模式:
    os.O_WRONLY:只写
    os.O_CREATE:创建文件
    os.O_RDONLY:只读
    os.O_RDWR:读写
    os.O_TRUNC:清空

    第三个参数:权限控制
    r-->4
    w-->2
    x-->1
    这里和linux的是一样的

    关于写入文件的一个例子,这里写了两种方法一种是直接writestring方法,一种是通过bufio的方式:

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
        "strconv"
    )
    
    func testWriteFile() {
        file, err := os.OpenFile("testWriteFile.txt", os.O_WRONLY|os.O_CREATE, 0666)
        if err != nil {
            fmt.Println("open file error:", err)
            return
        }
        defer file.Close()
        for i := 0; i < 10; i++ {
            file.WriteString("hello " + strconv.Itoa(i) + "
    ")
        }
    }
    
    func testWriteBufio() {
        file, err := os.OpenFile("testWriteBufio.txt", os.O_WRONLY|os.O_CREATE, 0666)
        if err != nil {
            fmt.Println("open file error;", err)
            return
        }
        defer file.Close()
    
        bufioWriter := bufio.NewWriter(file)
        for i := 0; i < 10; i++ {
            bufioWriter.WriteString(strconv.Itoa(i) + "hello
    ")
        }
        bufioWriter.Flush()
    
    }
    
    func main() {
        testWriteFile()
        testWriteBufio()
    }

    关于拷贝文件的例子:

    package main
    
    import (
        "fmt"
        "io"
        "os"
    )
    
    func copyFile() (writen int64, err error) { //注意这里返回的参数
        src, err := os.Open("testWriteFile.txt")
        if err != nil {
            fmt.Println("open src file error: ", err)
            return
        }
        defer src.Close()
    
        dst, err := os.OpenFile("dst.txt", os.O_WRONLY|os.O_CREATE, 0644)
        if err != nil {
            fmt.Println("openfile dst error: ", err)
            return
        }
        defer dst.Close()
    
        return io.Copy(dst, src)
    }
    func main() {
        copyFile()
    }

    关于获取命令行参数

    os.Args是一个string的切片,用来存储所有命令行的参数
    但是通过这种方式获取参数有点笨拙,并且需要做很多的判断,我们可以通过go里面的flag包来做,代码例子如下:

    package main
    
    import (
        "flag"
        "fmt"
    )
    
    var (
        conf  string
        level int
    )
    
    func init() {
        flag.StringVar(&conf, "c", "/Users/myname/", "请指定配置文件路径")
        flag.IntVar(&level, "l", 8, "请指定日志级别")
        flag.Parse() //这个非常重要,不能忘记
    }
    
    func main() {
        fmt.Printf("conf is %s
    ", conf)
        fmt.Printf("level is %d
    ", level)
        //运行go run args/args.go
        //go run args/args.go -c '/Users/myname/learngo' -l 7
        /*
                -c string
                    请指定配置文件路径 (default "/Users/myname/")
              -l int
                    请指定日志级别 (default 8)
        */
    }

    上面的例子设置了默认参数,如果我们想自定义参数在运行的时候添加 -c=内容 -l=内容 ,就可以用我们通过命令行参数传入的值进行处理

    转自https://www.cnblogs.com/zhaof/p/8285339.html

  • 相关阅读:
    在IIS7.5中ASP.NET调用cmd程序拒绝访问决绝方法小记
    WindowsCE project missing Microsoft.CompactFramework.CSharp.targets in Visual Studio 2008
    Windows 10预览版14316开启Bash命令支持
    批量文件重命名工具
    多说使用ua-parser-js显示浏览器和系统信息
    Hexo主题实现多级分类显示
    MS SQL Server 数据库分离-SQL语句
    Windows应用程序快捷方式创建工具
    第三方登录插件.NET版XY.OAuth-CSharp
    Microsoft Visual Studio 2008 未能正确加载包“Visual Web Developer HTML Source Editor Package” | “Visual Studio HTM Editor Package”
  • 原文地址:https://www.cnblogs.com/justdoyou/p/10042151.html
Copyright © 2020-2023  润新知