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\n", firstName, lastName)
    fmt.Sscanf(input, format, &f, &i, &s)
    fmt.Println("From the string we read are\n", 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")
    //// 下面这个表示我们读取一行,最后是以\n 为分割的,\n表示换行
    input, err = inputReader.ReadString('\n')
    if err != nil {
        fmt.Printf("error:", err)
        return
    }
    fmt.Printf("the input was:%s\n", 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\n", countLetter)
    fmt.Printf("数字的数量是:%d\n", countNum)
    fmt.Printf("空格的数量是:%d\n", countSpace)
    //之所以-1,是因为多算了一个换行符\n
    fmt.Printf("其他字符的数量是:%d\n", countOther-1)
}
func main() {
    var inputReader *bufio.Reader
    inputReader = bufio.NewReader(os.Stdin)
    str, err := inputReader.ReadString('\n')
    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('\n')
        if readErr == io.EOF { //表示读取到文件末尾
            return
        }
        i++ //行数
        //打印每行的行号和内容
        fmt.Printf("%d %s\n", 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\n", 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('\n')
        if err != nil {
            if err == io.EOF {
                break
            }
            fmt.Println("read file err:", err)
            break
        }
        fmt.Printf("%s\n", 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) + "\n")
    }
}

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\n")
    }
    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\n", conf)
    fmt.Printf("level is %d\n", 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

猜你喜欢

转载自www.cnblogs.com/justdoyou/p/10042151.html