Go 語(yǔ)言教程筆記(一)
一 Go 語(yǔ)言環(huán)境設(shè)置
本地環(huán)境設(shè)置
在這里我們介紹設(shè)置Go編程語(yǔ)言環(huán)境,需要在你的計(jì)算機(jī)上的準(zhǔn)備以下兩個(gè)軟件,(A)文本編
輯器和(B)Go編譯器。
文本編輯器
我的環(huán)境是ubuntu,直接用 vim
Go編譯器
ubuntu下面直接安裝
# apt-get install golang
例子:
# vim hello.go
1 package main
2
3 import fmt "fmt"
4
5 func main() {
6 fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界 ");
7 }
go語(yǔ)言中如果有if等后面需要跟大括號(hào)的語(yǔ)句,強(qiáng)制使用大擴(kuò)號(hào)跟if寫(xiě)在一行。
編譯運(yùn)行:
# go run hello.go
Hello, world; or Καλημέρα κόσμε; or こんにちは 世界
二 Go 語(yǔ)言程序結(jié)構(gòu)
在我們學(xué)習(xí)Go編程語(yǔ)言的基本構(gòu)建模塊,看看一個(gè)最低限度的Go程序結(jié)構(gòu),這樣我們
就可以把它作為即將到來(lái)的章節(jié)的參考。
Go 程序包含以下部分:
包聲明
導(dǎo)入包
函數(shù)
變量
語(yǔ)句和表達(dá)式
注釋
例如:
1 package main
2
3 import fmt "fmt"
4
5 func main() {
6 fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界 ");
7 }
第一行定義了這個(gè)程序包的名稱。這是一個(gè)必須聲明為Go程序運(yùn)行在什么包。main包是起始
點(diǎn)來(lái)運(yùn)行程序。每個(gè)包都有一個(gè)與之關(guān)聯(lián)的路徑和名稱。
下一行import "fmt" 是告訴編譯器去包含文件在包fmt的預(yù)處理命令。
下一行 func main()主要功能是為程序執(zhí)行的開(kāi)始。
如果有注釋,/*...*/會(huì)被編譯器被忽略,它已被加入到程序添加注釋。因此,這樣的行稱為程
序中的注釋。注釋也使用//類似于Java或C++注釋。
下一行 fmt.Println(...)是提供另一種功能,使消息“Hello, World!”要顯示在屏幕上。這
里fmt包已導(dǎo)出。
三 Go 語(yǔ)言的基本語(yǔ)法
標(biāo)識(shí)符
Go語(yǔ)言不允許標(biāo)識(shí)符中的標(biāo)點(diǎn)字符,如@,$和%。
Go是一種區(qū)分大小寫(xiě)的編程語(yǔ)言
Manpower 和 manpower 在Go中是兩個(gè)不同的標(biāo)識(shí)符
標(biāo)識(shí)符開(kāi)始以字母A到Z或a到z或下劃線_后跟零個(gè)或多個(gè)字母,下劃線和數(shù)字(0?9)
關(guān)鍵詞
下面的列表顯示了Go的保留字。這些保留的字可以不被用作常量或變量,或任何其他的標(biāo)識(shí)符
名稱。
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
在 Go 中空白格
僅包含空格,可能與注釋行,被稱為一個(gè)空行,Go編譯器完全忽略它。
var age int;
必須有至少一個(gè)空白字符(通常是一個(gè)空格)int和age之間的編譯器,以便能夠區(qū)分它們
fruit = apples + oranges; // get the total fruit
fruit和=之間或=和apples,雖然是自由的,如果想便于閱讀的目的,最好包括一些空格
四 Go 語(yǔ)言數(shù)據(jù)類型
在Go編程語(yǔ)言,數(shù)據(jù)類型指用于聲明變量或不同類型的功能的廣泛的系統(tǒng)。變量的類型決定了
有多少空間占用的存儲(chǔ)和存儲(chǔ)方式的位模式將被解釋。
Go的數(shù)據(jù)類型可分類如下:
Boolean Types
它們是布爾類型,它由兩個(gè)預(yù)定義的常量:(a) true (b) false
Numeric Types
它們是算術(shù)類型,表示整數(shù)類型或b。在整個(gè)程序浮點(diǎn)值
string types:
一個(gè)字符串類型代表組字符串值。它的值是一個(gè)字節(jié)序列。字符串是一次創(chuàng)造了穩(wěn)定的類型,
這是不可能改變一個(gè)字符串的內(nèi)容。預(yù)聲明的字符串類型為字符串。
Derived types:
它們包括:(a)指針類型,(b)數(shù)組類型,(c)結(jié)構(gòu)類型,(d)聯(lián)盟類型及(e)函數(shù)類型(f)切片類(g)
函數(shù)類型(h)接口類型(i)地圖類型(j)管道類型。
數(shù)組類型和結(jié)構(gòu)類型被統(tǒng)稱為聚合類型。函數(shù)的類型指定的一組具有相同的參數(shù)和結(jié)果類型所
有函數(shù)。
整數(shù)
1 uint8
8位無(wú)符號(hào)整數(shù) (0 - 255)
2 uint16
16位無(wú)符號(hào)整數(shù) (0 - 65535)
3 uint32
32位無(wú)符號(hào)整數(shù) (0 - 4294967295)
4 uint64
64位無(wú)符號(hào)整數(shù) (0 - 18446744073709551615)
5 int8
有符號(hào)8位整數(shù) (-128 - 127)
6 int16
有符號(hào)16位整數(shù) (-32768 - 32767)
7 int32
有符號(hào)的32位整數(shù) (-2147483648 - 2147483647)
8 int64
有符號(hào)的64位整數(shù) (-9223372036854775808 - 9223372036854775807)
浮點(diǎn)類型
1 float32
IEEE-754 32-bit 浮點(diǎn)數(shù)
2 float64
IEEE-754 64-bit 浮點(diǎn)數(shù)
3 complex64
復(fù)數(shù)與float32實(shí)部和虛部
4 complex128
復(fù)數(shù)與float64實(shí)部和虛部
其他數(shù)值類型
1 byte
相同于 uint8
2 rune
相同于 int32
3 uint
32 或 64 位
4 int
相同于 uint 的大小
5 uintptr
一個(gè)無(wú)符號(hào)整數(shù)來(lái)存儲(chǔ)指針值的解釋的比特位
五 Go 語(yǔ)言變量
變量是什么,只不是給定到存儲(chǔ)區(qū)域,我們的程序可以操縱的名稱。在Go中每個(gè)變量具有特定
的類型,它確定的大小和可變的存儲(chǔ)器的布局;能確定存儲(chǔ)器內(nèi)存儲(chǔ)的值的范圍;和組操作可以施
加到變量。
一個(gè)變量名可以由字母,數(shù)字和下劃線。它必須以字母或下劃線。大寫(xiě)和小寫(xiě)字母是不同的,因
為Go是區(qū)分大小寫(xiě)的?;谠摶绢愋驮谇懊娴恼鹿?jié)中說(shuō)明的那樣,將有以下基本變量類型:
byte 通常單個(gè)字節(jié)(一個(gè)字節(jié)),這是一個(gè)字節(jié)的類型
int 整數(shù)最自然的尺寸的機(jī)器
float32 單精度浮點(diǎn)值
Go編程語(yǔ)言也可以定義各種其他類型的變量,我們將在以后的章節(jié)列出,如:枚舉,指針,數(shù)
組,結(jié)構(gòu),聯(lián)合,等等。
Go中變量定義
var variable_list optional_data_type;
optional_data_type可以包括字節(jié),整型,float32,complex64,布爾或任何用戶定義的對(duì)象
等有效Go的數(shù)據(jù)類型,variable_list可以由用逗號(hào)分隔的一個(gè)或多個(gè)標(biāo)識(shí)符名稱。一些有效的聲
明如下所示:
var i, j, k int;
var c, ch byte;
var f, salary float32;
d = 42;
var i, j, k; 既聲明并定義了變量i,j和k;這指示編譯器創(chuàng)建一個(gè)名為i,j和k的 int類型變量。變量
可以再聲明時(shí)候初始化。變量的類型是由編譯器自動(dòng)根據(jù)傳遞給它的值判斷。
variable_name = value;
d = 3, f = 5; // declaration of d and f. Here d and f are int
對(duì)于沒(méi)有初始化定義:具有靜態(tài)存儲(chǔ)時(shí)間變量的隱含零初始化(所有字節(jié)的值為0);所有其它變量
的初始值是它們的數(shù)據(jù)類型的零值。
靜態(tài)類型聲明
package main
import "fmt"
func main() {
var x float64
x = 20.0
fmt.Println(x)
fmt.Printf("x is of type %T ", x)
}
編譯運(yùn)行結(jié)果是:
20
x is of type float64
動(dòng)態(tài)類型聲明/類型推斷
示例
試試下面的例子,其中的變量已經(jīng)聲明沒(méi)有任何類型的,并已確定在主函數(shù)中初始化。如果類型推斷的,我們已經(jīng)初始化的變量y使用:=運(yùn)算符,x初始化使用=運(yùn)算符。
package main
import "fmt"
func main() {
var x float64 = 20.0
y := 42
fmt.Println(x)
fmt.Println(y)
fmt.Printf("x is of type %T ", x)
fmt.Printf("y is of type %T ", y)
}
編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
20
42
x is of type float64
y is of type int
混合變量聲明
不同類型的變量可以一步到位使用類型推斷聲明。
package main
import "fmt"
func main() {
var a, b, c = 3, 4, "foo"
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Printf("a is of type %T ", a)
fmt.Printf("b is of type %T ", b)
fmt.Printf("c is of type %T ", c)
}
編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
3
4
foo
a is of type int
b is of type int
c is of type string