包的目录结构:
-
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() //一定要释放锁,否则会出现死锁