一、创建文件
- 创建文件步骤
- ①.导入“os”包,创建文件,读写文件的函数都在该包
- ②.指定创建的文件存放路径以及文件名
- ③.执行Create( )函数,进行文件创建
- ④.关闭文件
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("E:/Test/a.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
}
二、写入数据
1 - WriteString方法
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("E:/Test/b.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
n, err := file.WriteString("Hello World")
if err != nil {
fmt.Println(err)
}
fmt.Println(n)
}
2 - Write方法
- 其实WriteString方法的底层实现就是使用Write方法
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("e:/Test/c.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
var str string = "Hello World"
n, err := file.Write([]byte(str))
if err != nil {
fmt.Println(err)
}
fmt.Println(n)
}
3 - WriteAt方法
- 当WriteAt的offset为0时,表示从头开始写入数据
- 执行如下代码后,d.txt中的内容为"aaalo Wrold"
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Create("e:/Test/d.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
file.WriteString("Hello World")
var str string = "aaa"
n, err := file.WriteAt([]byte(str), 0)
if err != nil {
fmt.Println(err)
}
fmt.Println(n)
}
- 在原有内容后追加新内容
- 使用Seek定位光标到文件中原有内容的后面
- 执行如下代码后,d.txt中的内容为"Hello Worldaaa"
- Seek的offset理解
num, _ := file.Seek(0, io.SeekEnd)
:num=11num, _ := file.Seek(10, io.SeekEnd)
:num=21
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Create("e:/Test/d.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
file.WriteString("Hello World")
var str string = "aaa"
num, _ := file.Seek(0, io.SeekEnd)
fmt.Println("num=", num)
n, err := file.WriteAt([]byte(str), num)
if err != nil {
fmt.Println(err)
}
fmt.Println(n)
}
三、OpenFile函数
- OpenFile()这个函数有三个参数
- 第一个参数表示:打开文件的路径
- 第二个参数表示:模式,常见的模式有
- O_RDONLY(只读模式)
- O_WRONLY(只写模式)
- O_RDWR( 可读可写模式)
- O_APPEND(追加模式)
- 第三个参数表示: 权限,取值范围(0-7)
- 0:没有任何权限
- 1:执行权限(如果是可执行文件,是可以运行的)
- 2:写权限
- 3:写权限与执行权限
- 4:读权限
- 5:读权限与执行权限
- 6:读权限与写权限
- 7:读权限,写权限,执行权限
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("e:/Test/c.txt", os.O_APPEND, 6)
if err != nil {
fmt.Println(err)
}
defer file.Close()
n, err := file.WriteString("我的测试")
if err != nil {
fmt.Println(err)
}
fmt.Println(n)
}
四、读取文件数据
- 读取文件的基本流程
- ①.打开要读取的文件
- ②.对文件进行读取
- ③.关闭文件
- Open的底层实现:其实就是调用OpenFile,以只读的形式打开,没有任何权限
func Open(name string) (*File, error) {
return OpenFile(name, O_RDONLY, 0)
}
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Open("c:/Test/file.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
buffer := make([]byte, 1024*2)
n, err := file.Read(buffer)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(buffer[:n]))
fmt.Println("读取数据的长度:", n)
}
- 循环读取文件数据
- 使用
err == io.EOF
判断是否到达文件末尾
package main
import (
"fmt"
"io"
"os"
)
func main() {
file, err := os.Open("e:/Test/file.txt")
if err != nil {
fmt.Println(err)
}
defer file.Close()
buffer := make([]byte, 10)
for {
n, err := file.Read(buffer)
if err == io.EOF {
break
}
fmt.Print(string(buffer[:n]))
}
}
package main
import (
"fmt"
"io"
"os"
)
func main() {
file1, err := os.Open("e:/Test/file.txt")
if err != nil {
fmt.Println(err)
}
file2, err := os.Create("e:/Test/file2.txt")
if err != nil {
fmt.Println(err)
}
defer file1.Close()
defer file2.Close()
buffer := make([]byte, 1024*2)
for {
n, err := file1.Read(buffer)
if err == io.EOF {
break
}
file2.Write(buffer[:n])
}
}
五、常用字符串方法
- 参考地址:https://studygolang.com/pkgdoc
- 常用方法
- ①.Contains:判断一个字符串是否在另外一个字符串中
- ②.Join:字符串连接
- ③.Index:在一个字符串中查找某个字符串的位置
- ④.Repeat:某个字符串重复多少次,返回的是重复后的字符串
- ⑤.Replace:在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换
- ⑥.Split:把s字符串按照sep分割,返回slice(切片)
package main
import (
"fmt"
"strings"
)
func main() {
var str string = "hellogo"
b := strings.Contains(str, "goo")
fmt.Println(b)
s := []string{"abc", "hello", "world"}
str1 := strings.Join(s, "|")
fmt.Println(str1)
str3 := "abcHello"
n := strings.Index(str3, "Hello")
fmt.Println(n)
str4 := strings.Repeat("go", 3)
fmt.Println(str4)
str5 := "hello world"
fmt.Println(strings.Replace(str5, "l", "w", -1))
str6 := "hello@world@itcast"
s1 := strings.Split(str6, "@")
fmt.Println(s1)
}
- 案例1:日期格式转换:让用户输入一个日期格式,如:2018-01-02, 输出日期为2008年1月2日
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println("请输入日期,格式:年-月-日")
var str string
fmt.Scan(&str)
s := strings.Split(str, "-")
fmt.Println(s[0] + "年" + s[1] + "月" + s[2] + "日")
}
- 案例2:屏蔽字:让用户输入一句话,判断这句话中有没有“邪恶”,如果有“邪恶”就替换成“**”,然后输出
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println("请输入一句话:")
var str string
fmt.Scan(&str)
if strings.Contains(str, "邪恶") {
str = strings.Replace(str, "邪恶", "**", -1)
}
fmt.Println(str)
}
六、字符串转换
- 字符串转换导包:strconv
- 字符串与其他类型相互转换
package main
import (
"fmt"
"strconv"
)
func main() {
str := strconv.FormatBool(true)
fmt.Println(str)
str1 := strconv.Itoa(123)
fmt.Println(str1)
b, err := strconv.ParseBool("true")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(b)
}
num, err := strconv.Atoi("123")
if err != nil {
fmt.Println(err)
} else {
fmt.Println(num)
}
}