ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-23 11:33:21  阅读:121  来源: 互联网

标签:复习 err fmt 接口 Println fileObj GO os


包的定义--> 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有