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()   //一定要釋放鎖,否則會出現死鎖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章