12-Go基础:文件处理与字符串处理

本文详细介绍了Go语言中的文件操作,包括创建、写入数据(WriteString、Write、WriteAt方法)、OpenFile函数的使用。此外,还探讨了如何读取文件数据,以及常用字符串方法,如Contains、Join、Replace等。最后,提到了字符串与其他类型之间的转换。通过实例代码,展示了如何在Go中实现文件的复制和内容修改。
摘要由CSDN通过智能技术生成

一、创建文件

  • 创建文件步骤
    • ①.导入“os”包,创建文件,读写文件的函数都在该包
    • ②.指定创建的文件存放路径以及文件名
    • ③.执行Create( )函数,进行文件创建
    • ④.关闭文件
import (
	"fmt"
	"os"
)

func main() {
	// 创建文件,需要指定文件的存储路径以及文件名称,注意“/”
	file, err := os.Create("E:/Test/a.txt")
	//判断是否出现异常
	if err != nil {
		fmt.Println(err)
		//file.Close()
	}
	defer file.Close()
	//对创建的文件进行相关的操作

	//关闭
	//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) //11,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) // 11
}

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=11
    • num, _ := 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() {
	// 1: 打开要读取的文件
	file, err := os.Open("c:/Test/file.txt") // 注意:OpenFile方法的区别
	if err != nil {
		fmt.Println(err)
	}
	defer file.Close()
	// 2: 进行文件内容读取
	// 定义一个字符类型切片,存储从文件中读取的数据
	buffer := make([]byte, 1024*2) // 大小为2kb
	n, err := file.Read(buffer)    // 将从文件中读取的数据保存到字符切片中, n:表示从文件中读取的数据的长度
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(buffer[:n]))
	fmt.Println("读取数据的长度:", n)
	// 3: 关闭文件
}
  • 循环读取文件数据
    • 使用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() {
	// 1: 打开原有文件(file.txt)
	file1, err := os.Open("e:/Test/file.txt")
	if err != nil {
		fmt.Println(err)
	}
	// 2: 创建一个新的文件
	file2, err := os.Create("e:/Test/file2.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer file1.Close()
	defer file2.Close()
	// 3: 将原有文件中的内容读取出来,然后写入到新的文件中。
	buffer := make([]byte, 1024*2)
	for {
		n, err := file1.Read(buffer)
		if err == io.EOF {
			break
		}
		file2.Write(buffer[:n])
	}
	// 4: 关闭文件
}

五、常用字符串方法

  • 参考地址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") // 判断某个字符串是否在str中存在,如果存在返回true,否则返回false
	fmt.Println(b)

	//join方法的使用
	s := []string{"abc", "hello", "world"}
	str1 := strings.Join(s, "|") // 以"|"对切片中的内容进行分隔
	fmt.Println(str1)

	// Index
	str3 := "abcHello"
	n := strings.Index(str3, "Hello") // 判断"Hello"在str中出现的位置,注意位置从0开始计算
	fmt.Println(n)

	// Repeat
	str4 := strings.Repeat("go", 3) // 表示字符串"go"重复3次
	fmt.Println(str4)

	// Replace
	str5 := "hello world"
	fmt.Println(strings.Replace(str5, "l", "w", -1)) // 用新的字符串替换旧的字符串,第四个参数表示的替换的次数,如果小于0,表示全部替换

	// Split
	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() {
	// 1: 输入日期
	fmt.Println("请输入日期,格式:年-月-日")
	var str string
	fmt.Scan(&str)
	// 2: 按照"-"进行分隔
	s := strings.Split(str, "-")
	// 3: 输出指定的格式
	fmt.Println(s[0] + "年" + s[1] + "月" + s[2] + "日")
}
  • 案例2:屏蔽字:让用户输入一句话,判断这句话中有没有“邪恶”,如果有“邪恶”就替换成“**”,然后输出
package main

import (
	"fmt"
	"strings"
)

func main() {
	// 1:定义变量存储用户输入的一句话
	fmt.Println("请输入一句话:")
	var str string
	fmt.Scan(&str)
	// 2:判断用户输入的内容中是否有“邪恶”
	if strings.Contains(str, "邪恶") {
		// 3: 如果有,则进行替换
		str = strings.Replace(str, "邪恶", "**", -1)
	}
	fmt.Println(str)
}

六、字符串转换

  • 字符串转换导包:strconv
  • 字符串与其他类型相互转换
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 将bool类型转换成字符串类型
	str := strconv.FormatBool(true)
	fmt.Println(str)

	// 将int类型转换成字符串类型
	str1 := strconv.Itoa(123)
	fmt.Println(str1)

	// 字符串转成bool类型
	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)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无休止符

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值