go help
go build
标準格式
go help buildgo build [-o output] [-i] [build flflags] [packages]
-o 參數決定了編譯後文件名稱,例如我們要程序main.go編譯後程序名為hello,我們可以執行以下命令
-i install 安裝作為目标的依賴關系的包(用于增量編譯提速),一般很少使用。
附加參數
交叉編譯
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
交叉編譯參數含義
//用于聲明變量,聲明方式包括以下幾種:
var name1 int64
var name2 = 15 // int 類型
// 在func内可以使用簡寫等價,但是簡寫不可用于聲明全局變量,即不能用于func外
name3 := 15
name4, name5, name6 := "a", "b", "c" // 同時賦值給多個變量
//用于聲明常量,可以不用聲明類型,對于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)
}
用于包聲明,在Go中包的概念一般指同一文件夾下的的文件,與其它部分語言每個文件可以自己就是一個包不同。包名可以與文件夾名稱不同,但是一般建議相同(如果文件夾帶有版本号情況可以忽略版本号部分)需要寫在程序的可執行文件的第一行
package main
用于包的引用,引用路徑為工作區下的相對路徑,如果程序内引用了兩個不同路徑下相同的包名,可以通過設定别名的方式進行區分如果程序内需要用到引用包的初始化或者接口實現,但是沒有顯示調用,則需要使用_來進行區分
import (
"context"
echoContex "echo/context"
_ "notuse/context"
)
func main() {
context.Background()
echoContex.text()
}
返回參數如果為一個且不帶參數名,可以不用寫括号
返回參數超過一個或者帶參數名則需要用括号擴起
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 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,但反過來則不行。
//僅僅進行了類型聲明,并沒有分配内存空間,直接調用則會報錯
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
與for配合,用于遍曆,可遍曆數組,map,string(string底層存儲為byte數組)
goroutine異步攜程,但是不建議攜程處理大文件 , 可以攜程來寫日志和處理高IO操作,如果是cup密集型運算,則不建議使用
Go 中的一個控制結構,類似于用于通信的 switch 語句。每個 case 必須是一個通信操作,要麼是發送要麼是接收。
如果有同時多個case去處理,比如同時有多個channel可以接收數據,那麼Go會僞随機的選擇一個case處理(pseudo-random)。如果沒有case需要處理,則會選擇default去處理,如果default case存在的情況下。如果沒有default case,則select語句會阻塞,直到某個case需要處理
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語句所在的函數執行結束的時候會被調用。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!