首页
/
每日頭條
/
圖文
/
go程序詳解教程
go程序詳解教程
更新时间:2024-10-21 04:09:39
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語句所在的函數執行結束的時候會被調用。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
晚7點後不能吃什麼
晚7點後不能吃什麼
你的晚餐一般幾點吃?晚上6點?7點?還是8點?近日,一項研究顯示,睡前兩小時、或是晚上7點後進食,會導緻心梗腦梗高發!古人曾說,“過午不食”。所謂“午”,就是中午11點~13點,雖然現代人睡的時間明顯晚于古代,很難做到"過午不食"。但是小編...
2024-10-21
五紅養顔粥有幾種食材
五紅養顔粥有幾種食材
經典名著《紅樓夢》常常有描述賈府的各類餐飲,其中寫過一道粥,叫“紅稻米粥”。大家是不是覺得“紅稻米”很少聽到?因為紅稻米在非常珍貴,當時又稱“禦稻米”,專門供給皇宮的。紅稻米還有一個很好聽的名字叫“胭脂米”,做粥有異香。《紅樓夢》中寫到的情...
2024-10-21
正宗的齊齊哈爾烤肉就在這裡
正宗的齊齊哈爾烤肉就在這裡
正宗的齊齊哈爾烤肉就在這裡?齊齊哈爾街頭,随處可見“國際烤肉之都”的條幅,我來為大家科普一下關于正宗的齊齊哈爾烤肉就在這裡?下面希望有你要的答案,我們一起來看看吧!正宗的齊齊哈爾烤肉就在這裡齊齊哈爾街頭,随處可見“國際烤肉之都”的條幅齊齊哈...
2024-10-21
浙江省湖州市安吉城北地圖
浙江省湖州市安吉城北地圖
湖州地圖賞析浙江省湖州市吳興區南浔區德清縣長興縣安吉縣湖州市地圖#湖州頭條#湖州→杭州75公裡湖州→上海130公裡湖州→南京220公裡湖州人文地圖年代2017年湖州人文地圖湖州市兩區三縣:吳興區南浔區德清縣長興縣安吉縣浙江省湖州市湖州市曆史...
2024-10-21
适合發朋友圈即将過生日的文案
适合發朋友圈即将過生日的文案
适合發朋友圈即将過生日的文案?1.紀念我和媽媽相遇的日子2.生日拍了拍我的腦袋說:祝你快樂,下面我們就來說一說關于适合發朋友圈即将過生日的文案?我們一起去了解并探讨一下這個問題吧!适合發朋友圈即将過生日的文案1.紀念我和媽媽相遇的日子。2....
2024-10-21
Copyright 2023-2024 - www.tftnews.com All Rights Reserved