GO语言学习——复习包、接口、文件操作
作者:互联网
包
包的定义--> package关键字,包名通常是和目录名一致,不能包含-
- 一个文件夹就是一个包
- 文件夹里面放的都是.go文件
包的导入--> import
- 包导入路径是从$GOPATH/src后面的路径开始写起
- 单行导入
- 多行导入
- 给导入的包起别名
- 匿名导入-->sql包导入时会用
- Go不支持循环导入
包中标识符(变量名、函数名、结构体名、接口名、常量...)可见性--> 首字母大写表示对外可见
init()
- 包导入的时候会自动执行
- 一个包里面只有一个init()
- init()没有参数也没有返回值也不能调用它
- 多个包的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