Go 語言簡介
Go 是一個開源的編程語言,它能讓構造簡單、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發,后來還加入了Ian Lance Taylor, Russ Cox等人,並最終於2009年11月開源,在2012年早些時候發布了Go 1穩定版本。現在Go的開發已經是完全開放的,並且擁有一個活躍的社區。
1、Go 語言特色
- 簡潔、快速、安全
- 並行、有趣、開源
- 內存管理、v數組安全、編譯迅速
2、Go 安裝
安裝包下載地址為:https://golang.org/dl/。本文以1.4.2為例
3、Windows 系統下安裝
Windows 下可以使用 .msi 后綴(在下載列表中可以找到該文件,如go1.4.2.windows-amd64.msi)的安裝包來安裝。
默認情況下.msi文件會安裝在 c:\Go 目錄下。你可以將 c:\Go\bin 目錄添加到 PATH 環境變量中。添加后你需要重啟命令窗口才能生效。
4、安裝測試
創建工作目錄 C:\>Go_WorkSpace。
文件名: test.go,代碼如下:
package main import "fmt" func main() { fmt.Println("Hello, World!") }
使用 go 命令執行以上代碼輸出結果如下:
C:\Go_WorkSpace>go run test.go
Hello, World!
讓我們來看下以上程序的各個部分:
-
第一行代碼 package main 定義了包名。你必須在源文件中非注釋的第一行指明這個文件屬於哪個包,如:package main。package main表示一個可獨立執行的程序,每個 Go 應用程序都包含一個名為 main 的包。
-
下一行 import "fmt" 告訴 Go 編譯器這個程序需要使用 fmt 包(的函數,或其他元素),fmt 包實現了格式化 IO(輸入/輸出)的函數。
-
下一行 func main() 是程序開始執行的函數。main 函數是每一個可執行程序所必須包含的,一般來說都是在啟動后第一個執行的函數(如果有 init() 函數則會先執行該函數)。
-
下一行 /*...*/ 是注釋,在程序執行時將被忽略。單行注釋是最常見的注釋形式,你可以在任何地方使用以 // 開頭的單行注釋。多行注釋也叫塊注釋,均已以 /* 開頭,並以 */ 結尾,且不可以嵌套使用,多行注釋一般用於包的文檔描述或注釋成塊的代碼片段。
-
下一行 fmt.Println(...) 可以將字符串輸出到控制台,並在最后自動增加換行字符 \n。
使用 fmt.Print("hello, world\n") 可以得到相同的結果。
Print 和 Println 這兩個函數也支持使用變量,如:fmt.Println(arr)。如果沒有特別指定,它們會以默認的打印格式將變量 arr 輸出到控制台。 -
當標識符(包括常量、變量、類型、函數名、結構字段等等)以一個大寫字母開頭,如:Group1,那么使用這種形式的標識符的對象就可以被外部包的代碼所使用(客戶端程序需要先導入這個包),這被稱為導出(像面向對象語言中的 public);標識符如果以小寫字母開頭,則對包外是不可見的,但是他們在整個包的內部是可見並且可用的(像面向對象語言中的 private )。
5、執行 Go 程序
讓我們來看下如何編寫 Go 代碼並執行它。步驟如下:
-
打開編輯器如Sublime2,將以上代碼添加到編輯器中。
-
將以上代碼保存為 hello.go
-
打開命令行,並進入程序文件保存的目錄中。
-
輸入命令 go run hello.go 並按回車執行代碼。
-
如果操作正確你將在屏幕上看到 "Hello World!" 字樣的輸出。
注釋
注釋不會被編譯,每一個包應該有相關注釋。
單行注釋是最常見的注釋形式,你可以在任何地方使用以 // 開頭的單行注釋。多行注釋也叫塊注釋,均已以 /* 開頭,並以 */ 結尾。如:
// 單行注釋 /* Author by shouce.ren菜鳥教程 我是多行注釋 */
6、標識符
以下是無效的標識符:
- 1ab(以數字開頭)
- case(Go 語言的關鍵字)
- a+b(運算符是不允許的)
7、關鍵字
下面列舉了 Go 代碼中會使用到的 25 個關鍵字或保留字:
| break | default | func | interface | select |
| case | defer | go | map | struct |
| chan | else | goto | package | switch |
| const | fallthrough | if | range | type |
| continue | for | import | return | var |
程序一般由關鍵字、常量、變量、運算符、類型和函數組成。
程序中可能會使用到這些分隔符:括號 (),中括號 [] 和大括號 {}。
程序中可能會使用到這些標點符號:.、,、;、: 和 …。
8、Go 語言的空格
Go 語言中變量的聲明必須使用空格隔開,如:
var age int;
在 Go 編程語言中,數據類型用於聲明函數和變量。
數據類型的出現是為了把數據分成所需內存大小不同的數據,編程的時候需要用大數據的時候才需要申請大內存,就可以充分利用內存。
Go 語言按類別有以下幾種數據類型:
布爾型 --> 布爾型的值只可以是常量 true 或者 false。一個簡單的例子:var b bool = true。
整數型 --> 整型 int 和浮點型 float,Go 語言支持整型和浮點型數字,並且原生支持復數,其中位的運算采用補碼。
字符串 --> 字符串就是一串固定長度的字符連接起來的字符序列。Go的字符串是由單個字節連接起來的。Go語言的字符串的字節使用UTF-8編碼標識Unicode文本。
派生型 --> (a) 指針類型(Pointer)、(b) 數組類型、(c) 結構化類型(struct)、(d) 聯合體類型 (union)、(e) 函數類型、(f) 切片類型、(g) 接口類型(interface)、(h) Map 類型、 (i) Channel 類型
變量
1、變量聲明
第一種,指定變量類型,聲明后若不賦值,使用默認值。
- var v_name v_type
- v_name = value
var v_name v_type v_name = value
第二種,根據值自行判定變量類型。
var v_name = value
第三種,省略var, 注意 :=左側的變量不應該是已經聲明過的,否則會導致編譯錯誤。
v_name := value // 例如 var a int = 10 var b = 10 c : = 10
實例如下:
package main var a = "張岩林很帥" var b string = "https://www.cnblogs.com/aylin/" var c bool func main(){ println(a, b, c) }
以上實例執行結果為:
張岩林很帥 https://www.cnblogs.com/aylin/ false
2、多變量聲明
//類型相同多個變量, 非全局變量 var vname1, vname2, vname3 type vname1, vname2, vname3 = v1, v2, v3 var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要顯示聲明類型,自動推斷 vname1, vname2, vname3 := v1, v2, v3 //出現在:=左側的變量不應該是已經被聲明過的,否則會導致編譯錯誤 //類型不同多個變量, 全局變量, 局部變量不能使用這種方式 var ( vname1 v_type1 vname2 v_type2 )
如下:
package main var x, y int var ( //這種只能出現在全局變量中,函數體內不支持 a int b bool ) var c, d int = 1, 2 var e, f = 123, "hello" //這種不帶聲明格式的只能在函數體中出現 //g, h := 123, "hello" func main(){ g, h := 123, "hello" println(x, y, a, b, c, d, e, f, g, h) }
以上實例執行結果為:
0 0 0 false 1 2 123 hello 123 hello
如果你聲明了一個局部變量卻沒有在相同的代碼塊中使用它,同樣會得到編譯錯誤,例如下面這個例子當中的變量 a:
func main() { var a string = "abc" fmt.Println("hello, world") }
嘗試編譯這段代碼將得到錯誤 a declared and not used。
此外,單純地給 a 賦值也是不夠的,這個值必須被使用,所以使用
fmt.Println("hello, world", a)
但是全局變量是允許聲明但不使用。
Go 語言常量
常量是一個簡單值的標識符,在程序運行時,不會被修改的量。
常量中的數據類型只可以是布爾型、數字型(整數型、浮點型和復數)和字符串型。
常量的定義格式:
const identifier [type] = value
多個相同類型的聲明可以簡寫為:
const c_name1, c_name2 = value1, value2
以下實例演示了常量的應用:
package main import "fmt" func main() { const LENGTH int = 10 const WIDTH int = 5 var area int const a, b, c = 1, false, "str" //多重賦值 area = LENGTH * WIDTH fmt.Printf("面積為 : %d", area) println() println(a, b, c) }
以上實例運行結果為:
面積為 : 50 1 false str
常量還可以用作枚舉:
const ( Unknown = 0 Female = 1 Male = 2 )
數字 0、1 和 2 分別代表未知性別、女性和男性。
常量可以用len(), cap(), unsafe.Sizeof()常量計算表達式的值。常量表達式中,函數必須是內置函數,否則編譯不過:
package main import "unsafe" const ( a = "abc" b = len(a) c = unsafe.Sizeof(a) ) func main(){ println(a, b, c) }
以上實例運行結果為:
abc 3 16
1、ota
iota,特殊常量,可以認為是一個可以被編譯器修改的常量。
在每一個const關鍵字出現時,被重置為0,然后再下一個const出現之前,每出現一次iota,其所代表的數字會自動增加1。
iota 可以被用作枚舉值:
const ( a = iota b = iota c = iota )
2、iota 用法
package main import "fmt" func main() { const ( a = iota //0 b //1 c //2 d = "ha" //獨立值,iota += 1 e //"ha" iota += 1 f = 100 //iota +=1 g //100 iota +=1 h = iota //7,恢復計數 i //8 ) fmt.Println(a,b,c,d,e,f,g,h,i) }
以上實例運行結果為:
0 1 2 ha ha 100 100 7 8
