編程語言已經很是多,偏性能敏感的編譯型語言有 C、C++、Java、C#、Delphi和Objective-C 等,偏快速業務開發的動態解析型語言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特 定領域的語言有Erlang、R和MATLAB等,那麼咱們爲何須要 Go這樣一門新語言呢?html
數據來源:https://www.tiobe.com/tiobe-index/python
編程語言排行榜前9名是至關穩定的,可是第10名每月都會變化,候選人就是GO、Swift和R。Swift是IOS移動應用程序的頭號編程語言,可是僅僅適用IOS而不能用於Android,另外R語言的地位深深的被python壓制。程序員
在2000年之前的單機時代,C語言是編程王中王。隨着機器性能的提高、軟件規模和複雜度提升、Java逐步取代了C的大佬地位。可是Java編程的體驗並未盡人意。歷年來Java的市場份額在逐步降低,後勁不足。golang
羅伯特·格瑞史莫,羅波·派克,肯·湯普遜於2006年1月2號下午15點4分5秒設計出了go語言。編程
Robert開發GO以前是Google v八、HotSpot JVM的主要貢獻者;Rob主要是Unix、UTF-八、plan9的做者;Ken主要是C、B語言、Unix之父。windows
後來Ian Lance Taylor、Russ Cox加入項目,Ian Lance Taylor是GCC的做者之一,目前負責GCC的Go實現;Brad Fitzpatrick以前是Memcache的做者,目前主要是HTTP2的實現做者。緩存
Golang是Google開發的一種靜態強類型、編譯型、併發型、具備垃圾回收功能的編程語言。Go語言做者之一Rob Pike在新文章「Go: Ten years and climbing」中,回顧了一下 Go 語言的發展過程。他們本身都沒想到Go語言的迅猛發展,迅速成爲了雲計算領域中新一代開發語言,中國程序員對Go的熱愛超出了他們的想象。併發
Go語言特點:運維
Go語言不會吞噬底層到C和C++的級別,也不會吞噬到Java的業務層。Go語言必定能吞噬的是Pass上的項目,例如消息緩存中間件、服務發現、日誌收集、控制系統等。異步
Go語言殺手級的Docker應用優點:
安裝Golang
Go安裝 windows: 1、下載安裝包 https://golang.org/dl/ 國外網站 https://studygolang.com/dl 國內網站 下載地址: https://studygolang.com/dl/golang/go1.11.windows-amd64.msi 2.安裝 默認安裝路徑:C:\Go 3.環境變量已默認添加 C:\Go\bin;
Linux、MacOS
安裝包下載地址:https://studygolang.com/dl
查看golang環境go env命令
C:\Users\yuchao>go env set GOARCH=amd64 set GOBIN= set GOCACHE=C:\Users\yuchao\AppData\Local\go-build set GOEXE=.exe set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GOOS=windows set GOPATH=C:\Users\yuchao\go #存放golang項目的目錄,全部項目都放到gopath的src目錄下 set GOPROXY= set GORACE= set GOROOT=C:\Go #golang的安裝目錄 set GOTMPDIR= set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64 set GCCGO=gccgo set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD= set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS= set CGO_CXXFLAGS=-g -O2 set CGO_FFLAGS=-g -O2 set CGO_LDFLAGS=-g -O2 set PKG_CONFIG=pkg-config set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Q C:\Users\yuchao>
http://docscn.studygolang.com/doc/code.html
go命令依賴一個重要的環境變量:$GOPATH,gopath定義go項目的工做目錄。
例如go install 命令用於構建二進制命令,產生一個可執行的二進制文件,而後將該二進制文件做爲hello安裝到gopath的bin目錄中。
在目錄C:\Users\yuchao\go\src\go_study\hello\下建立hello.go文件,寫入代碼
package main //package關鍵字,指定hello.go屬於哪一個包,指定main就是說是可執行程序 import "fmt" //導入格式化輸出的fmt包 func main() { //func定義main函數,是程序的入口函數,在執行可執行二進制文件的時候,找到main函數體 fmt.Println("I am a gopher,i am saying 'Hello World!'") //fmt.Println打印並換行 }
go build 編譯生成可執行文件 hello.exe
golang最小粒度是包
#go build 編譯生成可執行二進制文件,go build 會去尋找gopath的src下的目錄 C:\Users\yuchao\go>go build go_study/hello #執行hello.exe文件 C:\Users\yuchao\go>hello.exe I am a gopher,i am saying 'Hello World!' #go build 指定目錄生成可執行文件 C:\Users\yuchao\go>go build -o bin/hello1.exe go_study/hello C:\Users\yuchao\go>cd bin C:\Users\yuchao\go\bin>hello1.exe I am a gopher,i am saying 'Hello World!'
go run 快速執行go文件,如同執行腳本同樣
C:\Users\yuchao\go>go run go_study/hello I am a gopher,i am saying 'Hello World!'
go install編譯成可執行文件到bin目錄下
C:\Users\yuchao\go>go install go_study/hello C:\Users\yuchao\go>cd bin C:\Users\yuchao\go\bin>hello.exe I am a gopher,i am saying 'Hello World!'
go test 單元測試/壓力測試
go fmt格式化源代碼
故意寫入亂的格式代碼
package main //告知golang這是可執行文件 import "fmt" //導入格式化輸出的package func main() { //主函數執行代碼 fmt.Println("I am a gopher,i am saying 'Hello World!'") }
#go fmt格式化代碼 C:\Users\yuchao\go\bin>go fmt go_study/hello
#此時查看源代碼的格式
單行註釋 // 多行註釋 /* */
Go語言中的函數名、變量名、常量名、類型名、語句標號和包名等全部的命名,都遵循命名規則
一個名字必須以一個字母或下劃線開頭,後面能夠跟任何數量的字母、數字、下劃線
例如
_ab123
name
Age_12
嚴格區分大小寫首字母,含義不一樣,例如Name和name是不一樣的
名字開頭字母的大小寫決定了名字在包外的可見性
Go語言推薦用駝峯式命名,如htmlEscape、NewConfigData、printHelp、
package main import "fmt" func main() { var _name = "YuChao" var Age = 18 fmt.Println(_name) fmt.Println(Age) }
Go語言預先定義好的,有特殊含義的關鍵字不能用於自定義名字,只能在特定語法結構體中用
Go語言有四種類型的聲明語句:var、const、type和func,分別是變量、常量、類型、函數實體對象。
package main import "fmt" //變量聲明語法 var identify type,定義變量並初始化,通常使用var聲明全局變量
//go存在零值初始化機制,確保每一個聲明的變量總有一個值,數值類型零值是0,布爾類型是false,字符串類型是空字符串,
接口或是(slice,map,chan和函數)變量對應零值是nil
/* var a int var b string var c bool var d int = 8 var e string = "hello" */ //var聲明方式二 /* var ( a int //0 b string // "" c bool // false d int = 8 // 8 name string = "yuchao" //hello age = 18 //go編譯器自動類型推導 ) */ //var聲明方式三 //平行賦值,忽略類型聲明,自動推導變量類型 var name,age,addr="chao",18,"shahe" func main() { fmt.Println(name,age,addr) fmt.Println(num1,num2,num3) //聲明變量name且賦值"chao",簡短聲明,只能在函數內部使用定義局部變量 name := "chao" fmt.Println(name) }
常量使用const修飾,表明永遠是隻讀的,不能修改。且const常量必須有值
package main import ( "fmt" ) //const pi = 3.1415926 //常量必須賦值,不寫就報錯 /* 優雅的寫法 const ( //go的類型推導,編譯器會根據值,推導出類型,是字符串,仍是數字 birthDay = "1993-10-1" pi = 3.1415926 ) */ const ( a int = 100 b //這裏若是不寫值和類型,會使用上一層a的值 c int = 200 d //同理使用c的值 ) func main() { //fmt.Printf("birthDay=%v\n", birthDay) //fmt.Printf("pi=%v", pi) fmt.Printf("a=%d b=%d c=%d d=%d\n", a, b, c, d) }
常量聲明也能夠用iota常量生成器初始化,它用於生成一組類似規則初始化的常量。可是不用每行都寫一遍初始化表達式。在一個const聲明語句中,在第一個聲明的常量所在行,iota會被設置爲0,而後在每個有常量聲明的行加一。
func main() { //fmt.Printf("birthDay=%v\n", birthDay) //fmt.Printf("pi=%v", pi) fmt.Printf("a=%d b=%d c=%d d=%d\n", a, b, c, d) const ( e = iota f // f=iota g //g=iota ) fmt.Printf("e=%d f=%d g=%d\n", e, f, g) //iota實際用在time包中的效果 //週日爲0,週一爲1,依次推導 type Weekday int const ( Sunday Weekday = iota Monday Tuesday Wednesday Thursday Friday Saturday ) fmt.Printf("Monday is %d\n", Monday) fmt.Printf("Saturday is %d\n", Saturday) }
布爾類型
package main import "fmt" //定義無參函數 func testBool() { var a bool fmt.Println(a) a = true fmt.Println(a) a = !a fmt.Println(a) var b bool = true if a == true && b == true { fmt.Println("正確") } else { fmt.Println("錯誤") } if a == true || b == true { fmt.Println("||正確") } else { fmt.Println("||錯誤") } fmt.Printf("%t %t\n", a, b) } func main() { testBool() }
goland IDE
下載地址:https://www.jetbrains.com/go/download/#section=windows 激活地址: http://idea.lanyus.com/