Go 是一種類 C 語言,大部分語法和 C 類似。
一、第一個 go 程序,Hello world。
package main
import "fmt" // 實現格式化的 I/O
/* Print something */
func main() {
fmt.Printf("Hello, world\n")
}
- 在不引起語義混淆的情況下,Go 可以省略句末的分號,編譯器會在每句末尾自動加上分號;並且強制要求左花括號位於句末,另起一行會出現編譯錯誤。
- 首行這個是必須的。所有的 Go 文件以
package <something>
開頭,對於獨立運行的執行文件必須是package main
; - 將
fmt
包(函數庫)導入到main
,可以使用小括號導入多個包,如
import (
"fmt"
"io"
)
- 在 Go 中, package 總是首先出現,然後是 import,接着是其他所有內容。當 Go 程序在執行的時候,首先調用的函數是 main(),這是從 C 中繼承而來。
- Go 的註釋可以用 C 風格註釋 /* */ 和 C++ 風格註釋 / /。
二、變量、數據類型
1、變量
Go 聲明變量時類型放在變量名之後
var varname vartype
。其中 var 爲聲明變量的保留字。Go 編譯器會對未初始化的變量自動賦值其類型的 0 。/* 先聲明,後初始化 */ var a int // 聲明 int 類型變量 var b bool // 聲明 bool 類型變量 a = 10 // 賦值 b = true /* 聲明變量並初始化 */ var c int = 12 /* 聲明並賦值的簡寫形式,變量類型是根據值推斷出來的,但是隻能用在函數內部 */ d := 8
- 多個 var 的聲明可以成組(使用圓括號),const 和 import 同樣可以如此做。相同類型的多個變量可以放在同一行,也可以使用平行賦值。一個特殊的變量名 _ 表示賦給它的值都將被丟棄。
/* 成組聲明變量 */ var ( ia int bb bool ) /* 相同類型變量同行聲明 */ var ic, id int var ic, id int = 1, 2 // 聲明並初始化 /* 平行賦值 */ ie, bg := 3, true // ie = 3, bg = true _, bg := 3, true // 3被丟棄
注意:Go 編譯器對聲明但未使用的變量會報錯。
2、類型
bool 類型
- 值爲 true 和 false。
數字類型
整型
有符號整數:
int int8 int16 int32 int64
無符號整數:uint uint8(byte) uint16 uint32 uint64
byte
是uint8
的別名,rune
是int32
的別名。賦值可以用八進制、十六進制或科學計數法: 077, 0xFF, 1e3 或者 6.022e23 這些都是合法的。
注意:int
類型是和系統相關的,在 32位操作系統上是32位,64爲操作系統上時64位。其他類型都和系統類型無關。注意:不同的數據類型之間不能混用,否則會出現編譯出錯。Go 的數據類型不支持隱式轉換,必須顯示轉換。
var a int = 2 var b int32 b = a + a // 錯誤,int 不能隱式轉換爲 int32 b = b + 5 // 可以
浮點型
float32 float64
常量
常量(const)是在編譯時被創建。只能是數字,字符串和布爾型。可以使用
itoa
生成枚舉值,第一次使用時值爲 0,再一次在新行使用時值加 1。const x = 4 // 聲明常量 /* 成組聲明 */ const ( x1 = 4 y1 = true ) /* itoa生成枚舉值 */ const ( a = iota // a = 0 b = iota // b = 1 c // c = 2 可以省略重複的 itoa,其值自動加 1 )
字符串
字符串在 Go 中是 UTF-8 的由雙引號(”“)包裹的字符序列。如果你使用單引號(”)則表示一個字符( UTF-8編碼)——這種在 Go 中不是 string。
注意:一旦給變量賦值,字符串就不能修改了:在 Go 中字符串是不可變的。
var s string = "hello" s[0] = 'c' // 報錯 /* 先轉換在修改 */ s := "hello" c := [] byte(s) 0. c[0] = 'c' 1. s2 := string(c) 2. fmt.Printf("%s\n", s2)
多行字符串連接需要將 “+” 放在當前行尾部,不要放在下一行開頭,否則編譯器會誤解加入分號導致錯誤。另一種方式是使用反引號 ` 作爲原始字符串符號,但是此時引號中的轉義字符不會被轉義。
s := "Starting part" + "Ending part" // 會被轉換爲: s := "Starting part" ; + "Ending part" ; // 這是錯誤的語法,應當這樣寫: s := "Starting part" + "Ending part" // 使用反引號 ` 作爲原始字符串符號,但轉義字符不被解釋 s := `Starting part // s 中含有換行符 Ending part`
rune
Rune 是 int32 的別名。用 UTF-8 進行編碼。一般用在需要遍歷字符串中的字符。可以循環每個字節(僅在使用 US ASCII 編碼字符串時與字符等價,而它們在 Go 中不存在!)。因此爲了獲得實際的字符,需要使用 rune 類型。
複數
Go 原生支持複數。默認變量類型是
complex128
( 64 位虛數部分)。還有complex64
(32 位的虛數部分)。複數寫爲re + im i
,re
是實數部分,im
是虛數部分,而i
是標記 ‘i’ ( √− 1)。var c complex64 = 5+5i; fmt.Printf("Value is: %v", c)
將會打印: (5+5i)。
注意:對於簡寫形式複數聲明賦值如
v := a + bi
,b
必須存在,否則出現i
無定義。錯誤
Go 有爲了錯誤而存在的內建類型,叫做 error。