tft每日頭條

 > 圖文

 > go程序詳解教程

go程序詳解教程

圖文 更新时间:2024-11-22 22:43:14
go 常用命令

go help

  • 獲取對應命令的幫助文檔,可以獲取到對應命令的作用以及對應參數

go build

  • 編譯項目,使其打包成可運行程序,配合參數可以進行交叉編譯

标準格式

go help buildgo build [-o output] [-i] [build flflags] [packages]

-o 參數決定了編譯後文件名稱,例如我們要程序main.go編譯後程序名為hello,我們可以執行以下命令

-i install 安裝作為目标的依賴關系的包(用于增量編譯提速),一般很少使用。

附加參數

go程序詳解教程(go基礎入門)1

交叉編譯

go語言向下支持C語言,可以在go語言中直接編寫C語言代碼

但是在編譯時,必須支持C語言

Mac上編譯Linux可執行二進制文件

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

Mac上編譯Windows可執行二進制文件

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Linux上編譯Mac可執行二進制文件

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go

Linux上編譯Windows可執行二進制文件

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

Windows上編譯Mac可執行二進制文件

SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 go build main.go

Windows上編譯Linux可執行二進制文件

SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build main.go

交叉編譯參數含義

  • CGO_ENABLED 是否使用cgo編譯,0為不使用,1為使用,使用cgo進行交叉編譯時需
  • 要編譯機器安裝對應的cgo程序
  • GOOS 目标操作系統标識,windows對應Windows操作系統exe可執行文件,darwin
  • 對應Mac可執行文件,linux對應Linux可執行文件,freebsd對應UNIX系統
  • GOARCH 目标可執行程序操作系統構架,包括 386,amd64,arm
  • go build 後接所編譯程序的入口文件
go語言關鍵詞

go程序詳解教程(go基礎入門)2

  • var 定義變量

//用于聲明變量,聲明方式包括以下幾種: var name1 int64 var name2 = 15 // int 類型 // 在func内可以使用簡寫等價,但是簡寫不可用于聲明全局變量,即不能用于func外 name3 := 15 name4, name5, name6 := "a", "b", "c" // 同時賦值給多個變量

  • cost 定義常量或常量集合

//用于聲明常量,可以不用聲明類型,對于int類型的常量可以用于int,int64等計算 package main import "fmt" // 全局常量 const a = 14 func main() { var b = 16 //int var c = int64(20) //int64 d := a b e := a c fmt.Println("d",d) fmt.Println("e",e) }

  • package

用于包聲明,在Go中包的概念一般指同一文件夾下的的文件,與其它部分語言每個文件可以自己就是一個包不同。包名可以與文件夾名稱不同,但是一般建議相同(如果文件夾帶有版本号情況可以忽略版本号部分)需要寫在程序的可執行文件的第一行

package main

  • import

用于包的引用,引用路徑為工作區下的相對路徑,如果程序内引用了兩個不同路徑下相同的包名,可以通過設定别名的方式進行區分如果程序内需要用到引用包的初始化或者接口實現,但是沒有顯示調用,則需要使用_來進行區分

import ( "context" echoContex "echo/context" _ "notuse/context" ) func main() { context.Background() echoContex.text() }

  • func /return 定義函數接收返回值
  • func 函數方法體聲明

返回參數如果為一個且不帶參數名,可以不用寫括号

返回參數超過一個或者帶參數名則需要用括号擴起

return 函數方法體返回,如果函數返回參數帶有參數名稱則返回時不需要将每個參數顯示返回,否則需要顯示返回

//有固定入參,無出參數 func demo1(name string) { return } //無固定入參,無出參數 func demo2(name string, params ...int64) { return } //無入參,單參數無名稱 func demo3() int64 { return 0 } //無入參,單參數有名稱 func demo4() (age int64) { return } //無入參,多參數無名稱 func demo5() (int64,string) { return 0,"" } //無入參,多參數有名稱 func demo6() (age int64,name string) { return }

  • type結構體或者接口的聲明
  • interface 接口,可以存放任意格式數據,也可以定義接口方法
  • struct 結構體

type demoI interface { funDemo1(string)int funDemo2(int64)string } //定義結構體實現接口方法 type demoS1 struct {} func (d *demoS1) funDemo1(string)int { return 0 } func (d *demoS1) funDemo2(int64)string { return "" } //接受參數為接口類型 func demo3(d demoI) { v,t := d.(*demoS1) fmt.Println(v) fmt.Println(t) }

一個 interface 被多種類型實現時,需要區分 interface 的變量究竟存儲哪種類型的值。go 可以使用 comma, ok 的形式做區分 value, ok := em.(T):em 是 interface 類型的變量。

T代表要斷言的類型,value 是 interface 變量存儲的值,ok 是 bool 類型表示是否為該斷言的類型 T,如果是按 pointer 調用,go 會自動進行轉換,因為有了指針總是能得到指針指向的值,如果是 value 調用,go 将無從得知 value 的原始值是什麼,因為 value 是份拷貝。go 會把指針進行隐式轉換得到 value,但反過來則不行。

  • map 是 Go 内置關聯數據類型(在一些其他的語言中稱為"哈希"或者"字典")

//僅僅進行了類型聲明,并沒有分配内存空間,直接調用則會報錯 var m0 map[string]int //聲明的同時進行了内存空間的申請 m1 := make(map[string]int) //讀取數據參數,返回參數可選,一個參數時為返回值,兩個參數時第二個參數表示是否存在 // 如果數據不存在則會返回數據類型的默認數據,但數據為指針類型時則返回nil,不做判 斷直接使用的話會panic value,h := m1["key"] m0 = make(map[string]int,100) //對變量進行初始化,并且預先分配存儲空間大小 _,_,_ = m0,value,h

  • range

與for配合,用于遍曆,可遍曆數組,map,string(string底層存儲為byte數組)

  • go

goroutine異步攜程,但是不建議攜程處理大文件 , 可以攜程來寫日志和處理高IO操作,如果是cup密集型運算,則不建議使用

  • select

Go 中的一個控制結構,類似于用于通信的 switch 語句。每個 case 必須是一個通信操作,要麼是發送要麼是接收。

如果有同時多個case去處理,比如同時有多個channel可以接收數據,那麼Go會僞随機的選擇一個case處理(pseudo-random)。如果沒有case需要處理,則會選擇default去處理,如果default case存在的情況下。如果沒有default case,則select語句會阻塞,直到某個case需要處理

  • chan

channel可以理解為一個先進先出的消息隊列。

channel裡面的value buffffer的容量也就是channel的容量。channel的容量為零表示這是一個阻塞型通道,非零表示緩沖型通道[非阻塞型通道]。

//nil chan var aChan chan int64 //無緩沖 var bChan = make(chan int64) //帶緩沖區 var cChan = make(chan int64,100)

  • defer

defer後面必須是函數調用語句,不能是其他語句,否則編譯器會出錯。

defer後面的函數在defer語句所在的函數執行結束的時候會被調用。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved