請(qǐng)從github下載配套代碼: https://github.com/shuningzhang/learn_golang
電子書(shū)下載地址: https://u19702000.ctfile.com/dir/19702000-33357795-bb2f31/
上一篇文章我們給了一個(gè)入門(mén)程序,接下來(lái)我們介紹在Go語(yǔ)言中的數(shù)據(jù)類(lèi)型和表達(dá)式相關(guān)的內(nèi)容。由于本文是簡(jiǎn)介性的文章,因此并不會(huì)事無(wú)巨細(xì)的介紹所有內(nèi)容,只是能夠讓讀者達(dá)到理解基本概念,并能夠使用的程度,更為深入的學(xué)習(xí)還需要其它材料。

數(shù)據(jù)類(lèi)型與變量
同任何其它編程語(yǔ)言一樣,Go語(yǔ)言支持多種類(lèi)型的數(shù)據(jù)。從大的分類(lèi)上面Go語(yǔ)言支持布爾類(lèi)型、數(shù)字類(lèi)型、字符串和派生類(lèi)型等幾種。
變量是存儲(chǔ)數(shù)據(jù)的存儲(chǔ)空間的別名,通過(guò)變量開(kāi)發(fā)人員可以方便的訪問(wèn)內(nèi)存空間,也就是訪問(wèn)其中存儲(chǔ)的數(shù)據(jù)。Go語(yǔ)言的變量是類(lèi)型相關(guān)的,也就是定義變量時(shí)需要指定變量的類(lèi)型,不同類(lèi)型的變量占用的內(nèi)存空間是不同的。
下面我們通過(guò)一個(gè)具體的示例說(shuō)明數(shù)據(jù)類(lèi)型和變量。
package main
import "fmt"
func main() {
/* 下面一行定義一個(gè)int8類(lèi)型的變量,也稱為聲明
* 變量。 可以看出聲明方式由3部分構(gòu)成,關(guān)鍵字
* var,變量名var_name和變量類(lèi)型int8。Go語(yǔ)言的
* 變量聲明方式與C或者Java等語(yǔ)言的方式不太一
* 樣,剛開(kāi)始學(xué)可能覺(jué)得有些怪,但并非Go語(yǔ)言獨(dú)創(chuàng)。*/
var var_name int8
/* 變量的賦值,也就是讓變量的內(nèi)容變?yōu)槟硞€(gè)值。 */
var_name = 5
/* 定義一個(gè)16位的整型數(shù),第二行進(jìn)行2個(gè)變量運(yùn)
* 算。 由于變量的類(lèi)型不一樣,因此需要進(jìn)行強(qiáng)制
* 類(lèi)型轉(zhuǎn)換。 */
var var_name_x int16
var_name_x = 11 + int16(var_name)
/* 上面介紹的都是數(shù)字型的數(shù)據(jù)類(lèi)型,除了上面的
* 類(lèi)型外,還有int32,int64,uint8,uint16,
* uint32,uint64等類(lèi)型,這些表示的是整型數(shù)。
* 而以u(píng)int頭的表示無(wú)符號(hào)整型數(shù)。 */
fmt.Println(var_name_x)
/* 除了整型數(shù)外,還有浮點(diǎn)型數(shù),浮點(diǎn)型數(shù)就是我們
* 日常說(shuō)的小數(shù) */
var float_name float32
float_name = 1.2
fmt.Println(float_name)
/* 浮點(diǎn)型數(shù)包括32位和64位兩種,也就是float32和float64。 */
/* 下面介紹的類(lèi)型是字符串類(lèi)型。 */
var str_name string
str_name = "test"
fmt.Println(str_name)
/* 變量可以在聲明的時(shí)候直接初始化。 */
var int_name int16 = 12
fmt.Println(int_name)
/* 可以同時(shí)聲明多個(gè)變量,如下是定義3個(gè)都為
* int32類(lèi)型的變量,并進(jìn)行初始化,初始化并非
* 強(qiáng)制要求的 */
var int_name_1, int_name_2, int_name_3 int32 = 1, 2, 3
fmt.Println(int_name_1, int_name_2, int_name_3)
/* 可以不聲明變量類(lèi)型,這樣編譯器會(huì)自動(dòng)選擇類(lèi)型 */
var int_name_4 = 160
/* 下面是最簡(jiǎn)單的變量聲明方式,可以將var關(guān)鍵字省略 */
int_name_5 := 170
fmt.Println(int_name_4, int_name_5)
/* 最后說(shuō)明一下,變量名可以字母、下劃線和數(shù)字,但只能以非數(shù)字開(kāi)頭。*/
}
當(dāng)然,這里介紹了有限的幾種數(shù)據(jù)類(lèi)型,但在后面的使用中基本上夠用了。
運(yùn)算符和表達(dá)式
程序大部分都是進(jìn)行運(yùn)算的,了解了變量的這些類(lèi)型,我們看一下Go語(yǔ)言如何進(jìn)行計(jì)算。Go語(yǔ)言的計(jì)算包括常規(guī)的加減乘除、關(guān)系運(yùn)算、位運(yùn)算和邏輯運(yùn)算。這些運(yùn)算與其它語(yǔ)言的運(yùn)算并沒(méi)有任何本質(zhì)的差異,運(yùn)算符也基本一致。
運(yùn)算符,所謂運(yùn)算符就是進(jìn)行運(yùn)算的符號(hào),比如+、-、*和/等,分別表示加減乘除。而>則用于計(jì)算兩個(gè)值的大小關(guān)系。
表達(dá)式是運(yùn)算符和數(shù)字或者變量的組合,用于進(jìn)行一系列的計(jì)算,最后會(huì)計(jì)算出一個(gè)結(jié)果。表達(dá)式中各個(gè)運(yùn)算符之間有優(yōu)先級(jí),基本遵循數(shù)學(xué)運(yùn)算的規(guī)則。
package main
import "fmt"
func main() {
var int_name_1, int_name_2, int_name_3 int32 = 1, 2, 3
var int_name_4 int32 = 0
/* Go語(yǔ)言支持常見(jiàn)的算術(shù)云算法,包括加減乘除和取模等 */
int_name_4 = int_name_1 + int_name_2
int_name_4 = int_name_1 - int_name_2
int_name_4 = int_name_1 * int_name_2
int_name_4 = int_name_1 / int_name_2
int_name_4 = int_name_1 % int_name_2 /*取模*/
int_name_3 ++ //自增
int_name_3 --
fmt.Println(int_name_1, int_name_2, int_name_3, int_name_4)
/* 關(guān)系運(yùn)算,也就是判斷2個(gè)變量的大小關(guān)系,如果滿足條件則返回真(true),否則返回假(false) */
var a bool
/* 舉個(gè)簡(jiǎn)單的例子,計(jì)算1是否大于2,如果大于則返回true,否則返回false。結(jié)果是顯然的 */
a = 1 > 2
fmt.Println(a)
a = 1 < 2
a = 1 >= 2
a = 1 <= 2
a = 1 == 2 //相等判斷
a = 1 != 2 //不等判斷
/* 邏輯運(yùn)算,也稱為布爾運(yùn)算,判斷一個(gè)或者多個(gè)值或者變量的邏輯關(guān)系 */
var b = bool
b = 1 && 1 //與運(yùn)算
b = 1 || 1 //或運(yùn)算
b = !1 //非運(yùn)算
fmt.Println(b)
/* 除了上述運(yùn)算外,還有位運(yùn)算,分別用& | ^表示按位與、或和異或運(yùn)算。本文不在贅述。 */
}
運(yùn)算符的優(yōu)先級(jí)
我們?cè)谝粋€(gè)表達(dá)式中不可能只用一個(gè)云算法,同時(shí)運(yùn)用多個(gè)運(yùn)算符的情況是經(jīng)常存在的。因此Go語(yǔ)言中定義了在同時(shí)出現(xiàn)多個(gè)運(yùn)算符是的等級(jí)。等級(jí)越高,則表示該運(yùn)算符會(huì)優(yōu)先執(zhí)行。優(yōu)先順序依次為:
- ^ !
- / % << >> & &^
- | ^
- == != < <= >= >
- <-
- &&
- ||
同一級(jí)別的從左向右執(zhí)行。另外,括弧優(yōu)先級(jí)是最高的,也就是括弧中的內(nèi)容會(huì)優(yōu)先執(zhí)行,下面是例程:
package main
import "fmt"
func main() {
var a int = 20
var b int = 10
var c int = 15
var d int = 5
var e int;
e = (a + b) * c / d; // ( 30 * 15 ) / 5
fmt.Printf("(a + b) * c / d 的值為 : %d", e );
e = ((a + b) * c) / d; // (30 * 15 ) / 5
fmt.Printf("((a + b) * c) / d 的值為 : %d" , e );
e = (a + b) * (c / d); // (30) * (15/5)
fmt.Printf("(a + b) * (c / d) 的值為 : %d", e );
e = a + (b * c) / d; // 20 + (150/5)
fmt.Printf("a + (b * c) / d 的值為 : %d" , e );
}
好了,今天先到這,學(xué)完本文基本上清楚了在程序設(shè)計(jì)中如何進(jìn)行運(yùn)算。后面我們?cè)俳榻B函數(shù)的概念。