[TOC]
<br>
<br>
>[success] ## **1:写文件实例操作**
### **1:基本介绍**
```
func OpenFile(name [string](string), flag [int](int), perm [FileMode](FileMode) (file *[File](File), err [error](error))
```
**说明**: os.OpenFile是\-一个更一般性的文件打开函数,它会使用指定的选项(如
O_RDONLY等) 、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返
回的文件对象可用于I/0。如果出错,错误底层类型是\*PathError.
<br>
**OpenFile参数说明:**
1,name string:要打开的文件路径
2,flag int :文件的打开模式(可以组合)
3,perm FileMode:文件是什么权限控制的
<br>
**第二个参数**:文件打开模式;如下
const (
O\_RDONLY int = syscall.O\_RDONLY // 只读模式打开文件
O\_WRONLY int = syscall.O\_WRONLY // 只写模式打开文件
O\_RDWR int = syscall.O\_RDWR // 读写模式打开文件
O\_APPEND int = syscall.O\_APPEND // 写操作时将数据附加到文件尾部
O\_CREATE int = syscall.O\_CREAT // 如果不存在将创建一个新文件
O\_EXCL int = syscall.O\_EXCL // 和O\_CREATE配合使用,文件必须不存在
O\_SYNC int = syscall.O\_SYNC // 打开文件用于同步I/O
O\_TRUNC int = syscall.O\_TRUNC // 如果可能,打开时清空文件
)
**第三个参数**:打开文件权限
注意:FileMode在windows下是不管用,只有在liunx或unix下面才管用
![](https://img.kancloud.cn/62/9a/629a2c2503b25d2f34f67a4b29b0a7d6_988x720.png)
<br>
<br>
>[success] ## **2:写文件方式一**
1)**创建一个新文件,写入内容5句**"hello, Gardon"
![](https://img.kancloud.cn/a2/b3/a2b352a37ebf95094611e08eb9c9c011_981x720.png)
<br>
2)打开一个存在的文件中,**将原来的内容覆盖成新的内容**10句"jeson 要挺住!"
![](https://img.kancloud.cn/ba/9a/ba9a33fbc0c838dc9e97e57e07437d20_1183x720.png)
<br>
3)打开一个存在的文件,在原来的内容**追加内容**'ABC! ENGLISH!' 例如日志
![](https://img.kancloud.cn/f4/ee/f4ee8f938cb8b1d7d2db987ddc1202ad_1102x720.png)
<br>
4)打开一个存在的文件,将原来的内容读出显示在终端,并且追加3句话"
![](https://img.kancloud.cn/20/8b/208b02b24b9f7fd6f769dc758172b447_744x720.png)
使用os.OpenFile(), bufio.NewWriter(), \*Writer的方法WriteString完成上面的任务,**带缓冲方法**
<br>
<br>
>[success] ## **3:写文件方式二**
案例如下:
编程一个程序,将一个文件的内容,写入到另外一个文件。注:这两个文件已经存在了
>:将src/Go\_project/Open/bufiotest文件中的内容写入
src/Go\_project/Open/bufiotest2
说明:
1)使用ioutil.ReadFile / ioutil.WriteFile完成写文件的任务.
![](https://img.kancloud.cn/3a/43/3a43a45763e8d30150075e490e31e5c0_1272x720.png)
<br>
<br>
>[success] ## **4:判断文件是否存在**
golang判断文件或文件夹是否存在的方法为使用**os.Stat()**函数返回的错误值进行判断:
1)如果返回的错误为nil,说明文件或文件夹存在
2)如果返回的错误类型使用**os.IsNotExist()**判断为true,说明文件或文件夹不存在
3)如果返回的错误为其它类型,则不确定是否在存在
![](https://img.kancloud.cn/75/11/75114ddb9993512afb806e29e19c086d_1280x237.png)
![](https://img.kancloud.cn/69/65/6965b4791fc784c1632628df943476e5_1280x233.png)
<br>
<br>
>[success] ## **5:文件拷贝**
![](https://img.kancloud.cn/86/80/868059210529508c9468b4b11b7cf105_1280x351.png)
**注意:** copy函数是io包实现的
![](https://img.kancloud.cn/ba/f7/baf713fbfd6f0d841c0a5be0b71f11d4_775x720.png)
<br>
<br>
>[success] ## **6:文件统计**
说明:统计一个文件中含有的英文、数字、空格及其它字符数量。
![](https://img.kancloud.cn/be/4d/be4d9e12abf7fb54a7c10f7995e411e4_997x720.png)
![](https://img.kancloud.cn/d9/41/d941fe914ac725d53379338ffe412bf8_1280x619.png)
<br>
<br>
>[success] ## **7:flag命令解析**
### **1:基本介绍**
```
[func StringVar(p *string, name string, value string, usage string)](StringVar)
```
![](https://img.kancloud.cn/ba/e2/bae282f3b251c1dabf5c5f17cbf2b219_1280x237.png)
![](https://img.kancloud.cn/d8/bf/d8bf636d1b2a57f95b49cb1cda3ff60d_1280x253.png)
![](https://img.kancloud.cn/31/f0/31f0ceade42961262e1dcd8af2f7d87c_1280x247.png)
主要是来获取终端的参数命令,例如mysql的登录 mysql -u root -p 3306 -h127.0.0.1
flag包就是来获取\-u 和 \-p -h后面的参数,而且使用flag包,不需要按照固定死的写法来写,我们可以将key value的前后顺序打乱,例如:mysql -p 3306 -u root ........
### **2:案例演示**
![](https://img.kancloud.cn/7a/04/7a043819aa6ae24a1921add9a3f92ec0_1280x586.png)
命令行参数使用提示:
![](https://img.kancloud.cn/4d/70/4d7009e01445334b92b2ae5249a6943e_1280x374.png)
<br>
<br>
>[success] ## 8:json(JavaScript Object Notation)
### **1:json基本介绍**
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。key-val
JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。
JSON易于机器解析和生成,并有效地提升**网络传输效率**,通常程序在网络传输时会先将**数据(结构体、map等)序列化成json字符串到接收方得到json字符串时,在反序列化恢复成原来的数据类型(结构体、map等)** 这种方式已然成为各个语言的标准。
![](https://img.kancloud.cn/5b/ad/5bad5dcf7ba0dd8229b17fd18590688e_1280x497.png)
### **2:json数据格式**
在JS语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等.
JSON键值对是用来保存数据一种方式,
键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,然后紧接着值:
```
{
"code":1,
"msg":"success",
"data":{
"name":"pig",
"age":"18",
"sex":"man",
"hometown":{
"province":"江西省",
"city":"抚州市",
"county":"崇仁县"
}
}
}
```
### **3:Marshal()与unmarshal**
Json Marshal:将数据编码成json字符串(序列化)
Json Unmarshal:将json字符串解码到相应的数据结构(反序列化)
**应用实例如下**:
![](https://img.kancloud.cn/0c/59/0c59ae077c44af12f041e26aa154560b_1280x353.png)
![](https://img.kancloud.cn/94/88/94885bf56f65ad759df044755bd7944a_1280x302.png)
![](https://img.kancloud.cn/f4/6a/f46ac35c557714926a39c144590b41f5_909x720.png)
<br>
<br>
### **4:使用json tag指定字段名**
序列化与反序列化默认情况下使用结构体的字段名,我们可以通过给结构体字段添加tag来指定json序列化生成的字段名
案例如下:
![](https://img.kancloud.cn/bb/a8/bba83a03a7561ba64dfb65e7e5cce757_1280x250.png)
### **5:json的序列化**
json序列化是指,将有**key-value** 结构的数据类型(比如结构体、map、切片)序列化成json字符串
这里我们介绍一下**结构**体,**map**和**切片**的序列化
**序列化方法:官网解释如下:**
**func [Marshal]**
**func Marshal(v interface{}) (\[\]byte, error)**
Marshal函数返回v的json编码。
Marshal函数会递归的处理值。如果一个值实现了Marshaler接口切非nil指针,会调用其MarshalJSON方法来生成json编码。nil指针异常并不是严格必需的,但会模拟与UnmarshalJSON的行为类似的必需的异常。
否则,Marshal函数使用下面的基于类型的默认编码格式:
布尔类型编码为json布尔类型。
浮点数、整数和Number类型的值编码为json数字类型。
字符串编码为json字符串。角括号""会转义为"\\u003c"和"\\u003e"以避免某些浏览器吧json输出错误理解为HTML。基于同样的原因,"&"转义为"\\u0026"。
数组和切片类型的值编码为json数组,但\[\]byte编码为base64编码字符串,nil切片编码为null。
结构体的值编码为json对象。每一个导出字段变成该对象的一个成员。
* [ ] 自己解释:Marshal方法接受一个interface,而我们在学方法时曾说过,接受类型是**interface可以接受任何数据类型**,Marshal方法返回两个参数,**一个byte切片,一个error报错**
* [ ] **注意:Marshal内部会做一个判断,如果该v中的字段可以用则序列化,不可以用(例如小写)则不取出--------Marshal内部有反射机制**
**5.1:结构体序列化:**
![](https://img.kancloud.cn/47/5d/475d432f1c73d126e584fc60bf858e4e_1280x709.png)
**5.2:map序列化**
![](https://img.kancloud.cn/41/b6/41b687a7d8caa82b9238d17753e8d2ea_1280x465.png)
**5.3:Slice序列化**
![](https://img.kancloud.cn/9a/6c/9a6c9d51e3681465169a9205529d3c10_1022x720.png)
- Golang语言之旅
- 第一章:初始小节以及安装
- 一:Golang语言特性
- 二:Windows上安装Go语言开发包
- 三:在Mac OS上安装Go语言开发包
- 第二章:GO语言注意事项
- 一:Dos的常用指令
- 第三章:Go初识小菜
- 一:Go语言之变量与常量
- 二:Go内置值-引用类型
- 三:基本的数据类型
- 四:字符串(char)
- 五:布尔类型(bool)
- 六:字符串类型(string)
- 七:基本数据类型的默认值
- 八:基本数据类型的互相转换
- 九:基本数据类型和string类型的相互转换
- 十:Golang指针
- 十一:值类型和引用类型
- 十二:标识符和命名规范
- 十三:系统保留关键字and预定义标识符
- 十四:fmt常用方法解析
- 第四章:Go运算符
- 一:运算符的基本介绍
- 二:算术运算符
- 2.1:算数运算符细节
- 三:关系运算符
- 3.1:关系运算符细节
- 四:逻辑运算符
- 4.1:逻辑运算符细节及案例
- 五:Go赋值运算符
- 5.1:案例演示赋值运算符的基本使用
- 5.2:赋值运算符的特点
- 六:Go位运算符
- 七:其他运算符
- 八:运算符的优先级
- 九:控制台输入语句
- 十:进制
- 十一:位运算
- 第五章:流程控制大纲
- 一:if语句
- 二:switch语句
- 三:for循环
- 第六章:函数-包-错误处理
- 一:Go函数
- 二:Go包
- 三:匿名函数
- 四:闭包
- 五:函数defer
- 六:函数参数的传递方式
- 七:变量的作用域
- 八:时间和日期相关函数
- 九:new和recover异常
- 十:数组(Array)切片(Section)
- 十一:切片(slice)
- 十二:3 数组的排序和查找
- 第七章:Map
- 第一节:Map基础认识
- 第二节:Map初始化和make
- 第三节:Map增删改查
- 第四节:Map的切片
- 第五节:Map的注意事项
- 第八章:面向对象(上)
- 第一节:结构体(值类型)
- 第二节:方法
- 第三节:面向对象编程应用实例
- 第九章:面向对象(下)
- 第一节:面向对象之抽象
- 第二节:面向对象之继承
- 第三节:面向对象之多态
- 第四节:接口
- 第十章:文件操作
- 第一节:文件基本介绍
- 第二季:写文件实例操作
- 第三节:JSON
- 第十一章:单元测试
- 第一节:单元测试介绍
- 第二节:单元测试案例
- 第三节:单元测试总结
- 第四节:单元测试案例
- 第十二章:goroutine和channel
- 第一节:goroutine基本介绍
- 第二节:goroutine入门案例
- 第三节:goroutione调度模型
- 第四节:Golang设置运行的CPU数量
- 第十二章:channel
- 第一节:channel基本介绍
- 第二节:channel基本使用
- 第三节:channel案例演示
- 第四节:channel 使用的注意事项
- 第五节:channel练习题
- 第六节:channel的遍历和关闭
- 第七节:goroutione和channel结合
- 第八节:channel细节处理
- 第十二章:并发模式
- 第十三章:反射reflect
- 第一节:反射基本介绍
- 第二节:反射重要的函数和概念
- 第三节:反射快速入门案例
- 第四节:反射注意事项
- 第五节:反射练习题
- 第六节:反射最佳实践