Go基础--终端操作和文件操作

简介: 终端操作 操作终端相关的文件句柄常量os.Stdin:标准输入os.Stdout:标准输出os.Stderr:标准错误输出 关于终端操作的代码例子: package main import "fmt" var ( firstName,lastName,s string i int f float32 input = "56.

终端操作

操作终端相关的文件句柄常量
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!\n",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:")
    // 下面这个表示我们读取一行,最后是以\n 为分割的,\n表示换行
    input,err = inputReader.ReadString('\n')
    if err != nil{
        fmt.Println(err)
        return
    }
    fmt.Printf("the input was:%s\n",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)
    // 关于其他字符这里进行减一是因为这里多算了一个换行符\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 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('\n')
        // 这里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\n",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('\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 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 开发\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 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\n",conf)
    fmt.Printf("level is :%d\n",level)
}

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

所有的努力都值得期许,每一份梦想都应该灌溉!
目录
相关文章
|
4月前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
3月前
|
SQL 关系型数据库 MySQL
go 通过sql操作mysql
go 通过sql操作mysql
25 1
|
4月前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
109 0
|
23天前
|
机器学习/深度学习 移动开发 Linux
Go从入门到放弃之文件操作
Go从入门到放弃之文件操作
|
3月前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
2月前
|
分布式计算 大数据 Go
MaxCompute操作报错合集之使用go sdk调用GetTunnelEndpoint出现报错:InvalidAction.NotFoundSpecified api is not found,该如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
2月前
|
运维 Devops API
阿里云云效操作报错合集之直接用API调用可以使用,但是本地用Go代码调用失败,是什么导致的?
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
4月前
|
存储 安全 编译器
go语言中进行不安全的类型操作
【5月更文挑战第10天】Go语言中的`unsafe`包提供了一种不安全但强大的方式来处理类型转换和底层内存操作。包含两个文档用途的类型和八个函数,本文也比较了不同变量和结构体的大小与对齐系数,强调了字段顺序对内存分配的影响。
112 8
go语言中进行不安全的类型操作
|
3月前
|
Go
如何在Go中进行文件操作以及如何使用协程来实现并发编程
如何在Go中进行文件操作以及如何使用协程来实现并发编程
37 2
|
3月前
|
关系型数据库 MySQL Go
Go语言介绍以及如何在Go语言中操作MySQL数据库
Go语言介绍以及如何在Go语言中操作MySQL数据库
48 3