浅谈Go语言中的文件读入

原创 2018年04月14日 23:10:33

/本篇blog是因为1-10.go而写的/

听说我居然在文件写入的时候遇到了麻烦?

对了,1-10.go的位置:
https://github.com/ShiinaOrez/go_practice/blob/master/Go%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80/1/1-10.go


Go-文件写入的四种方式


第一种:io.WriteString()

在此之前介绍两个函数:

    func checkFileIsExist(filename string) bool
    func check(err error) bool

checkFileIsExist()

func checkFileIsExist(filename string) bool {
    exist:=true
    if _,err:=os.Stat(filename);os.IsNotExist(err){
        exits=false
    }
    return exist
}

看上去不是一个很复杂的程序,但是出现了两个我们陌生的函数:os.Stat(filenmae)、os.IsNotExist(err)


os.Stat(filename):

返回文件的系统状态相关信息:

os.Stat(filename).Name() string//获取文件名
os.Stat(filename).IsDir() bool//判断是否是目录
os.Stat(filename).ModTime() time.Time//获取文件修改时间
os.Stat(filename).Mode() FileMode//文件的权限
os.Stat(filename).Size() int64//获取文件大小
os.Stat(filename).Sys() interface{}//基础数据源接口

os.IsNotExist(err error):

函数中有这么一段代码:

var (
    ErrInvalid = errors.New("invalid argument")
    ErrPermission = errors.New("permission denied")
    ErrExist = errors.New("file already exists")
    ErrNotExist = errors.New("file does not exist")
)

剩下的不用多说,显而易见。

check()

func check(err error){
    if(err!=nil){
        panic(err)
    }
    return 
}

这个函数是一个错误检查函数,我们传递一个error类型的参数进去,如果它确实是一个错误(没有错误就是nil了)那么使用panic中断进程。

这就涉及了一个很有意思的事情:GO语言中的错误处理。

显而易见,错误在go语言程序中是如此常见,基本所有的函数都会返回一个error。因此在Google上的go group中也有对于error处理的广泛讨论。https://blog.csdn.net/erlib/article/details/24012743


回归正题,我们继续说怎么用io.WriteString()来写入文件。

var f *os.File
var err error
if checkFileIsExist(filename) { //如果文件存在
        f, err = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
        fmt.Println("文件存在")
    } else {
        f, err = os.Create(filename) //创建文件
        fmt.Println("文件不存在")
    }
    check(err)
    n, err := io.WriteString(f, wireteString) //写入文件(字符串)
    check(err)
    fmt.Printf("写入 %d 个字节n", n)

问题接踵而至,这个叫做os.Openfile(filename,os.O_APPEND,0666)

三个参数:filename,os.O_APPEND,0666

第一个参数:文件名
第二个参数:打开方式
第三个参数:这TM是啥?


题外话:0666

wa这个0666是什么鬼畜操作?

0666代表权限。

4,2,1分别代表读入,写入,执行权限
6=4+2   就是读写权限
7=4+2+1 就是读写执行权限
那么也就是说权限只能在0~7之间,所以采用八进制存储,最前面的一位0代表八进制。

为什么三个6?(因为老铁双击666啊)

每一位代表一种类型的权限:
    第一位是拥有者的权限
    第二位是同组权限
    第三位是他人的权限

第二种:ioutil.WriteFile()

d:=[]byte("I love muxi")
err:=ioutil.WriteFile(filename,d,0666)
check(err)

第三种:File(Write,WriteString)

    var n int64
    f, err = os.Create("./"+filename) //创建文件
    check(err)
    defer f.Close()
    n,err = f.Write(d) //写入文件(字节数组)
    check(err)
    fmt.Printf("写入 %d 个字节n", n)
    n,err = f.WriteString("I LOVE MUXI") //写入文件(字节数组)
    fmt.Printf("写入 %d 个字节n", n)
    f.Sync()

第四种:

    w := bufio.NewWriter(f) //创建新的 Writer 对象
    n, err = w.WriteString("I love muxi")
    fmt.Printf("写入 %d 个字节n", n)
    w.Flush() //将缓存区提交到底层的io.Writer
    f.Close()

这里写图片描述

浅谈C语言中图形处理技术

  • 2009年07月16日 16:07
  • 100KB
  • 下载

从go语言中找&和*区别

*和&的区别 : & 是取地址符号 , 即取得某个变量的地址 , 如 ; &a *是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值...
  • sybnfkn040601
  • sybnfkn040601
  • 2017-01-19 12:52:05
  • 4570

GO语言中的关键字

25个关键字: 程序声明:import、package 程序实体声明和定义:chan、const、func、interface、map、struct、type、var 程序流程控制:go、sele...
  • Ligongxiang123
  • Ligongxiang123
  • 2018-01-25 13:40:31
  • 82

Go语言中的defer关键字

官方文档中关于defer语句的解释: defer语句延迟执行一个函数,该函数被推迟到当包含它的程序返回时(包含它的函数 执行了return语句/运行到函数结尾自动返回/对应的goroutine p...
  • qwertyupoiuytr
  • qwertyupoiuytr
  • 2017-02-15 21:34:44
  • 761

Go 语言的 parse 解析器

解析器起始很简单,但是用处很大。当我们解析 XML文件,json文件,对源代码进行静态分析都是需要解析器。 Go 语言的 parser 是一个十分基础的解析器,采用递归下降语法进行解析。接下来,我就...
  • xiaorenwuzyh
  • xiaorenwuzyh
  • 2015-03-20 16:24:32
  • 602

举例讲解Go语言中函数的闭包使用

和变量的声明不同,Go语言不能在函数里声明另外一个函数。所以在Go的源文件里,函数声明都是出现在最外层的。 “声明”就是把一种类型的变量和一个名字联系起来。 Go里有函数类型的变量,这样,...
  • txj236
  • txj236
  • 2016-08-05 18:27:38
  • 265

C++电话薄 文件读取 文件写入 添加删除修改联系人 分类显示 查询功能

  • 2010年06月16日 14:56
  • 954KB
  • 下载

我的Go语言学习之旅三:Go语言中的for循环

这个可是为难我了,我一直是走在WEB前的程序员,各种循环用起来得心应手,突然间发现到了Go这里居然行不通了,查阅后才发现,原来Go的for是这样写的。for i:=0;i<10;i++{fmt....
  • w_yunlong
  • w_yunlong
  • 2015-12-29 11:57:21
  • 4475

go语言如何将时间转化为字符串String类型

在golang中获取时间用time.Now().Unix() 由于是时间戳类型,所以我们这里用strconv.FormatInt()就可以了,后面的第二个参数我一直都写10,具体我也不知道什么意思,我...
  • NerverSimply
  • NerverSimply
  • 2017-11-19 19:35:38
  • 86

c语言中16进制读入输出

C语言内置可以处理十六进制的方法,如下: 用%x/%X %x表示小写%X表示大写。 如果数字比较大 由int改成__int64 对该变量的读写也要相应的改成%I64x或者%I64X 在初...
  • kioyeung
  • kioyeung
  • 2011-12-28 12:39:25
  • 3278
收藏助手
不良信息举报
您举报文章:浅谈Go语言中的文件读入
举报原因:
原因补充:

(最多只允许输入30个字)