其他分享
首页 > 其他分享> > GO语言学习——复习包、接口、文件操作

GO语言学习——复习包、接口、文件操作

作者:互联网

包的定义--> package关键字,包名通常是和目录名一致,不能包含-

包的导入--> import

包中标识符(变量名、函数名、结构体名、接口名、常量...)可见性--> 首字母大写表示对外可见

init()

接口

接口是一种类型,一种抽象的类型

接口就是你要实现的方法的清单

接口的定义

type mover interface {
    方法的签名(参数)(返回值)
}

接口的实现

实现了接口的所有方法就实现了这个接口

实现了接口就可以当成这个接口类型的变量

接口变量

实现了一个万能的变量,可以保存所有实现了我这个接口的类型的值

通常是作为函数的参数出现

空接口

interface{}:空接口

接口中没有定义任何方法,也就是说任意类型都实现了空接口-->任何类型都可以存到空接口变量中

作为函数参数--> fmt.PrintIn()

map[string]interface{}

接口底层

类型断言

做类型断言的前提是一定要是一个接口类型的变量

x.(T)

使用switch来做类型断言

package main

import "fmt"

// 类型断言

func main() {
	var a interface{} // 定义一个空接口变量a

	a = 100
	// 如何判断a保存的值的具体类型是什么?
	// 类型断言
	// 1. x.(T)

	v1, ok := a.(int8)
	if ok {
		fmt.Println("猜对了,a是int8", v1)
	} else {
		fmt.Println("猜错了,不是int8")
	}

	// 2. switch
	switch v2 := a.(type) {
	case int8:
		fmt.Println("int8", v2)
	case int16:
		fmt.Println("int16", v2)
	case int32:
		fmt.Println("int32", v2)
	case int64:
		fmt.Println("int64", v2)
	case string:
		fmt.Println("string", v2)
	case int:
		fmt.Println("int", v2)
	default:
		fmt.Println("书山有路勤为径")
	}
}

文件操作

打开文件和关闭文件

package main

import (
	"fmt"
	"os"
)

// 文件操作

func f1() {
	var fileObj *os.File
	var err error
	fileObj, err = os.Open("./main.go")
	if err != nil {
		fmt.Printf("open file failed, err:%v\n", err)
		return
	}
	defer fileObj.Close() // 当err有值的时候,fileObj就是nil,nil不能调用Close()
}

func main() {
	f1()
}

读文件

fileObj.read()

bufio

ioutil

写文件

os.OpenFile()

fileObj.Write/fileObj.WriteString

bufio

ioutil

在文件中间插入内容

package main

import (
	"fmt"
	"io"
	"os"
)

// 文件操作 在文件中间插入内容

func f1() {
	var fileObj *os.File
	var err error
	fileObj, err = os.Open("./main.go")
	if err != nil {
		fmt.Printf("open file failed, err:%v\n", err)
		return
	}
	defer fileObj.Close() // 当err有值的时候,fileObj就是nil,nil不能调用Close()
}

func f2() {
	// 打开要操作的文件
	fileObj, err := os.OpenFile("./test.txt", os.O_RDWR, 0644)
	if err != nil {
		fmt.Printf("open file failed, err:%v\n", err)
		return
	}
	// defer fileObj.Close()
	// 因为没有办法直接在文件中间插入内容,所以要借助一个临时文件
	tmpFile, err := os.OpenFile("./jjy.tmp", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Printf("create tmp file failed, err:%v\n", err)
		return
	}
	defer tmpFile.Close()
	// 读取文件写入临时文件
	var ret [1]byte
	n, err := fileObj.Read(ret[:])
	if err != nil {
		fmt.Printf("read from file failed, err:%v\n", err)
		return
	}
	fmt.Println(string(ret[:n]))
	// 写入临时文件
	tmpFile.Write(ret[:n])
	// 再写入要插入的内容
	var s []byte
	s = []byte{'c'}
	tmpFile.Write(s)
	// 紧接着把原文件后续的内容写入临时文件
	var x [1024]byte
	for {
		n, err = fileObj.Read(x[:])
		if err == io.EOF {
			tmpFile.Write(x[:n])
			break
		}
		if err != nil {
			fmt.Printf("read from file failed, err:%v\n", err)
			return
		}
		tmpFile.Write(x[:n])
	}

	// 关闭文件 重命名文件 删除文件
	fileObj.Close()
	tmpFile.Close()
	os.Rename("./jjy.tmp", "test.txt")
	// fileObj.Seek(1, 0) // 光标移到b 注意:\r\n
	// var s []byte
	// s = []byte{'c'}

	// fileObj.Write(s)

}

func main() {
	// f1()
	f2()
}

标签:复习,err,fmt,接口,Println,fileObj,GO,os
来源: https://www.cnblogs.com/QiaoPengjun/p/16511218.html