包的目錄結構:
-
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() //一定要釋放鎖,否則會出現死鎖