zoukankan      html  css  js  c++  java
  • Go基础--终端操作和文件操作

    终端操作

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

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

    package main
    
    import "fmt"
    
    var (
        firstName,lastName,s string
        i int
        f float32
        input = "56.12/5212/Go"
        format = "%f/%d/%s"
    )
    
    func main() {
        fmt.Println("please enter your full name:")
        //fmt.Scanln(&firstName,&lastName)
        fmt.Scanf("%s %s",&firstName,&lastName) //这一句和上一句是相同的
        fmt.Printf("Hi %s %s!
    ",firstName,lastName)
        fmt.Sscanf(input,format,&f,&i,&s)
        fmt.Println("From the string we read:",f,i,s)
    
    }

    关于带缓冲区的读写

    这里需要用到一个包:bufio

    下面是代码例子:

    package main
    
    import (
        "bufio"
        "os"
        "fmt"
    )
    
    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('
    ')
        if err != nil{
            fmt.Println(err)
            return
        }
        fmt.Printf("the input was:%s
    ",input)
    }

    练习终端操作

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

    package main
    
    import (
        "fmt"
        "bufio"
        "os"
    )
    
    func judgeCount(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.Println("英文字母的个数:", countLetter)
        fmt.Println("数字的个数:", countNum)
        fmt.Println("空格的个数:", countSpace)
        // 关于其他字符这里进行减一是因为这里多算了一个换行符
    
        fmt.Println("其他字符的个数:", countOther-1)
    
    }
    
    func main(){
        fmt.Println("请输入一行字符串:")
        var inputReader *bufio.Reader
        inputReader = bufio.NewReader(os.Stdin)
        str,err := inputReader.ReadString('
    ')
        if err!=nil{
            fmt.Println("输入错误,错误为:",err)
            return
        }
        judgeCount(str)
    }

    关于文件读写

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

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

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

    package main
    
    import (
        "os"
        "fmt"
        "bufio"
        "io"
    )
    
    func main(){
        file,err:= os.Open("/Users/zhaofan/go_project/src/go_dev/07/ex13/main.go")
        if err!= nil{
            fmt.Println("open file is err:",err)
            return
        }
        //这里切记在打开文件的时候跟上defer 关闭这个文件,防止最后忘记关闭
        defer file.Close()
        inputReader := bufio.NewReader(file)
        for {
            inputString,readError:= inputReader.ReadString('
    ')
            // 这里readError == io.EOF表示已经读到文件末尾
            if readError ==io.EOF{
                return
            }
            // 下面会把每行的内容进行打印
            fmt.Printf("the input is:%s",inputString)
        }
    
    }

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

    package main
    
    import (
        "io/ioutil"
        "fmt"
    )
    
    func main(){
        buf,err := ioutil.ReadFile("/Users/zhaofan/go_project/src/go_dev/07/ex13/main.go")
        if err != nil{
            fmt.Println("read file is err:",err)
            return
        }
        fmt.Printf("%s
    ",string(buf))
    
    }

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

    package main
    
    import (
        "os"
        "fmt"
        "compress/gzip"
        "bufio"
        "io"
    )
    
    func main(){
        file,err := os.Open("/Users/zhaofan/go_project/src/go_dev/07/ex6/ggg.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 err:",err)
            return
        }
        bufReader := bufio.NewReader(reader)
        for{
            line,err := bufReader.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 (
        "os"
        "fmt"
        "bufio"
    )
    
    func testWriteFile(){
        file,err:= os.OpenFile("mylog.txt",os.O_WRONLY|os.O_CREATE,0666)
        if err!= nil{
            fmt.Println("open file failed:",err)
            return
        }
        defer file.Close()
        for i:=0;i<10;i++{
            file.WriteString(fmt.Sprintf("go web 开发
    "))
        }
    
    }
    
    func testWriteBuf(){
        file,err:= os.OpenFile("mylog.txt",os.O_WRONLY|os.O_CREATE,0666)
        if err!= nil{
            fmt.Println("open file failed:",err)
            return
        }
        defer file.Close()
    
        bufioWrite := bufio.NewWriter(file)
        for i:=0;i<10;i++{
            bufioWrite.WriteString("hello
    ")
        }
        bufioWrite.Flush()
    }
    
    func main(){
        //testWriteFile()
        testWriteBuf()
    }

    关于拷贝文件的例子:

    package main
    
    import (
        "os"
        "io"
    )
    
    func CopyFile()(writen int64,err error){
        src,err:=os.Open("mylog.txt")
        if err!= nil{
            return
        }
        defer src.Close()
        dst,err := os.OpenFile("dst.txt",os.O_WRONLY|os.O_CREATE,0644)
        if err!=nil{
            return
        }
        defer dst.Close()
        return io.Copy(dst,src)
    }
    
    func main(){
        CopyFile()
    }

    关于获取命令行参数

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

    package main
    
    import (
        "fmt"
        "flag"
    )
    
    var(
        conf string
        level int
    )
    
    func init()  {
        flag.StringVar(&conf,"c","/home/user/zhaofan","请指定配置文件路径")
        flag.IntVar(&level,"l",8,"请指定日志级别")
        flag.Parse() //这个非常重要不能忘记写
    }
    
    func main()  {
        //for _,val := range os.Args{
        //  fmt.Println(val)
        //}
    
        fmt.Printf("conf is :%s
    ",conf)
        fmt.Printf("level is :%d
    ",level)
    }

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

  • 相关阅读:
    html5 postMessage解决跨域、跨窗口消息传递
    获取url参数值(可解码中文值)
    正则去除字符串中的html标签,但不去除<br>标签
    vue中watch检测到不到对象属性的变化的解决方法
    封装LocalStorage.js
    this.$router.push、replace、go的区别
    Javascript实现base64的加密解密
    堆排序
    归并排序
    单例模式
  • 原文地址:https://www.cnblogs.com/zhaof/p/8285339.html
Copyright © 2011-2022 走看看