博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go基础--终端操作和文件操作
阅读量:7050 次
发布时间:2019-06-28

本文共 5397 字,大约阅读时间需要 17 分钟。

终端操作

操作终端相关的文件句柄常量

os.Stdin:标准输入
os.Stdout:标准输出
os.Stderr:标准错误输出

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

package mainimport "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!\n",firstName,lastName)    fmt.Sscanf(input,format,&f,&i,&s)    fmt.Println("From the string we read:",f,i,s)}

关于带缓冲区的读写

这里需要用到一个包:bufio

下面是代码例子:

package mainimport (    "bufio"    "os"    "fmt")var inputReader *bufio.Readervar input stringvar err errorfunc main(){    inputReader = bufio.NewReader(os.Stdin)    fmt.Println("please enter some input:")    // 下面这个表示我们读取一行,最后是以\n 为分割的,\n表示换行    input,err = inputReader.ReadString('\n')    if err != nil{        fmt.Println(err)        return    }    fmt.Printf("the input was:%s\n",input)}

练习终端操作

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

代码实现:

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

关于文件读写

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

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

关闭一个文件:File.Close()

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

package mainimport (    "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('\n')        // 这里readError == io.EOF表示已经读到文件末尾        if readError ==io.EOF{            return        }        // 下面会把每行的内容进行打印        fmt.Printf("the input is:%s",inputString)    }}

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

package mainimport (    "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\n",string(buf))}

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

package mainimport (    "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('\n')        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 mainimport (    "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 开发\n"))    }}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\n")    }    bufioWrite.Flush()}func main(){    //testWriteFile()    testWriteBuf()}

关于拷贝文件的例子:

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

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

所有的努力都值得期许,每一份梦想都应该灌溉!

转载地址:http://isvol.baihongyu.com/

你可能感兴趣的文章
真的,移动端尺寸自适应与dpr无关
查看>>
Odoo自定义报表 - 浅析
查看>>
Boss直聘邮件通知小脚本
查看>>
初探XRebel
查看>>
面对自动驾驶的道德迷宫,奔驰选择弃路人救乘客
查看>>
脑洞大开!网易推出国内首部VR漫画《地狱电梯》
查看>>
谷歌被法国数据保护监管机构开出5000万欧元罚单
查看>>
阿里Java研发工程师实习面经,附面试技巧
查看>>
主流区块链(公链)项目总结
查看>>
智能制造催促企业蜕变,关键的“人才”还需政企校的进一步联合
查看>>
你造吗?机器人都在排队买iPhone了
查看>>
Bootstrap学习笔记--图片,jumbotron,page-header,well,警告,按钮,Glyphicon组件,徽章,标签
查看>>
共建安全大生态——2016第十七届信息安全大会采风
查看>>
AR红包大战,抢的不是钱而是发展机会
查看>>
行业人士会聚柏林共话区块链应用与发展
查看>>
IBM陈黎明:“喧嚣”是你们的,而Watson的行业应用早已“照进现实”
查看>>
CacheCloud bug修复日志
查看>>
新零售周年考:创业者和投资人交出了怎样的答卷?
查看>>
JSP中HTTP状态码
查看>>
【转】A Beginner's Guide To Understanding Convolutional Neural Networks
查看>>