Bootstrap

go语言进阶

包的目录结构:

  • src目录是专门用来存放go源码文件,每个文件夹都对应一个package

  • 同一目录下所有go文件都属于一个包

  • import时从go安装目录GOPROOT和GOPATH开始索引
    import时 绝对路径:根据src的下一级目录开始
    import时 相对路径:main.go所在的路径,以"."开始
    import时使用.操作

       import (
           . "fmt"
       )
       调用:println("no fmt")
    

    import别名

    import(
    	f "fmt",
    	client  "http/client"
    )
    

init函数使用:

  • 执行时间:init函数是go语言的保留函数,在main之前执行,同main函数一样不能有参数和返回值

  • 同一包中多个go文件init函数执行顺序:按首字母排序

  • 一个go文件内多个init函数执行顺序:从上到下

  • 不同包之间存在依赖init函数执行顺序:最后被依赖的最先执行

    import(
    	_  "github.com/mysql/godrv"
    )
    // 导入这个包不使用其他函数,仅使用init函数
    

当使用goland编辑器执行main.go文件时会自动在go/pkg文件夹对应目录生成同名.a文件,但使用go build则不会,只有再go install后才会生成

文件操作:

import (
	"os"
)
fileInfo, err := os.Stat("/usr/local")
name := fileInfo.Name()     //文件名
size := fileInfo.Size()     //文件大小
dir := fileInfo.IsDir()      //是否是目录
time := fileInfo.ModTime()     //修改时间
auth := fileInfo.Mode()        //权限

路径操作:

import (
	"path",
	"path/filepath"
	"os"
)
abpath := filepath.Abs("tmp.txt")     //绝对路径
fapath := path.Join("tmp.txt", "..")   //父目录
dir := os.Mkdir("/usr/local/tmp", os.ModePerm)    //创建文件夹
mdir := os.MkdirAll("/usr/local/tmp/more", os.ModePerm)    //创建多级文件夹

文件操作:

import "os"

file, err := os.Create("/tmp/amber.txt")   // 创建文件
file, err := os.Open("/tmp/amber.txt")     //只读
file, err := os.OpenFile("/tmp/amber.txt", os.RDONLY|os.WDONLY, os.ModePerm) //可读可写
file, err := os.Remove("/tmp/amber.txt")  //删除文件/文件夹
file.Close()             //关闭连接

io操作

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

rfile, err := os.Open("/tmp/amber.txt")
defer rfile.Close()
bs := make([]byte, 1024, 1024)
n, err := rfile.Read(bs)    //bs存储读取的数据,n代表bs个数
if err == io.EOF{
	fmt.Println(" read end")
}

wfile, err := os.OpenFile("/tmp/amber.txt", os.RDONLY|os.WDONLY, os.ModePerm)
n, err := wfile.Write(bs)    //n代表写入的字节个数

图片/电影复制:

func copy() err{
	rfile, err := os.Open("/tmp/amber.txt")
	wfile, err := os.OpenFile("/tmp/amber.txt", os.RDONLY|os.WDONLY, os.ModePerm)
	return io.Copy(wfile, rfile)
}

goroutine协程:

GPM模型实现高并发

  • M:相当于执行线程的模型
  • P:调度G进程
  • G:进程

M若遇到阻塞的G会在生成一个M执行后续的G
P若发现没有执行的G,可以从其他M去调度进程G

import "runtime"
runtime.GOROOT()       //go路径/usr/xx/go
runtime.GOOS()         //操作系统类型,mac本是darwin

临界资源:进程/线程/携程共享的资源(多个窗口同时卖票)

互斥锁:

import "sync"

var mutex sync.Mutex   //定义一把锁
mutex.Lock()
xxx //同步代码:只能被一个协程执行
mutex.Unlock()   //一定要释放锁,否则会出现死锁

读写锁:

  • 读操作可以多个同时进行,当一个写操作执行,不允许任何其他的读和写操作
import "sync"

var rwMutex sync.RWMutex   //定义一把锁
rwMutex.RLock()
xxx //同步代码:只能被一个协程执行
rwMutex.RUnlock()   //一定要释放锁,否则会出现死锁
;