請(qǐng)從github下載配套代碼: https://github.com/shuningzhang/learn_golang
電子書下載地址: https://u19702000.ctfile.com/dir/19702000-33357795-bb2f31/
前面文章本號(hào)給大家介紹了基本的數(shù)據(jù)類型眨业,表達(dá)式和函數(shù)等內(nèi)容级历。有的時(shí)候基本的數(shù)據(jù)類型可能不能滿足我們開發(fā)的需求,我們可能需要一些數(shù)據(jù)類型的組合霹菊。比如我們要把一個(gè)班級(jí)里面所有人的平均成績(jī)存在一起擦酌,然后計(jì)算整個(gè)班級(jí)的平均成績(jī)霸妹。大家想一下错妖,這種情況下應(yīng)該用什么類型的變量?
數(shù)組
接著上面我們舉的例子谆棺,如果要計(jì)算平均成績(jī)?cè)趺崔k呢栽燕?這就用到了數(shù)組的概念。數(shù)組從字面上理解就是一組數(shù)改淑,它是指類型相同的一組數(shù)碍岔。這組數(shù)在內(nèi)存中是順序存儲(chǔ)的,因此朵夏,我們可以通過數(shù)組名字的索引來(lái)訪問其中的數(shù)據(jù)蔼啦,而不同定義多個(gè)變量。
如圖1是數(shù)組內(nèi)部結(jié)構(gòu)的示意圖侍郭,我們可以通過數(shù)組的索引訪問數(shù)組內(nèi)部的數(shù)據(jù)询吴。通常數(shù)組的索引是從0開始的,0表示第一個(gè)元素亮元。下面我們給出一個(gè)Go語(yǔ)言的具體示例:
package main
import "fmt"
/* 這個(gè)函數(shù)用于計(jì)算幾個(gè)學(xué)生成績(jī)的均值 */
func calc_average () (float32) {
var student_1 uint32 = 67
var student_2 uint32 = 89
var student_3 uint32 = 96
var student_4 uint32 = 87
var student_5 uint32 = 79
var sum uint32 = 0
var result float32 = 0;
sum = student_1 + student_2 +
student_3 + student_4 +
student_5
result = float32(sum) / 5
return result
}
/* 上面函數(shù)計(jì)算均值數(shù)據(jù)數(shù)量少猛计,可能并看不出有
* 多麻煩,如果有100個(gè)學(xué)生爆捞,上面一個(gè)函數(shù)將會(huì)非常
* 復(fù)雜奉瘤。
* 下面這個(gè)函數(shù)利用了數(shù)組,功能是一樣的煮甥。*/
func calc_average_ex() (float32) {
/* 這里定義一個(gè)數(shù)組盗温,并進(jìn)行初始化,初始化不
* 是必須的成肘。
* 數(shù)組的名稱 數(shù)量 類型 數(shù)組初始化的數(shù)據(jù) 卖局。*/
var students = [5] uint32 {67, 89, 96, 87, 79}
var sum uint32 = 0
var result float32 = 0
var i uint32 = 0
/* 通過數(shù)組,結(jié)合for循環(huán)可以非常容易的計(jì)算
* 累加和双霍。
* 數(shù)組索引是從0開始的砚偶,0表示第一個(gè)元素批销。 */
for i = 0; i<5; i++ {
/* 數(shù)組的訪問通過[]進(jìn)行,其中i是索引染坯。
* 讀或者寫其中的值都通過[]訪問均芽。 */
sum += students[i]
}
result = float32(sum) / 5
return result
}
func main() {
/* 這里是函數(shù)的調(diào)用 */
fmt.Println( calc_average_ex() )
}
上面數(shù)組數(shù)量,如果有初始化的情況下可以不必指定大小单鹿,此時(shí)編譯器會(huì)根據(jù)初始化的數(shù)據(jù)數(shù)量自動(dòng)確定大小掀宋,具體定義的格式如下:
var students = [...] uint32 {67, 89, 96, 87, 79}
數(shù)組的內(nèi)容還很多,我們這里先學(xué)會(huì)基本的使用仲锄,后續(xù)再詳細(xì)介紹劲妙。
結(jié)構(gòu)體
上面數(shù)組用于計(jì)算非常方便,但是如果我們需要一種數(shù)據(jù)類型表示學(xué)生昼窗,比如包含姓名是趴、年齡和分?jǐn)?shù)等,這樣就比較難以實(shí)現(xiàn)了澄惊。這時(shí)就可以通過結(jié)構(gòu)體來(lái)實(shí)現(xiàn)。結(jié)構(gòu)體是對(duì)多種數(shù)據(jù)類型的封裝富雅,形成一個(gè)新的數(shù)據(jù)類型掸驱,之后我們就可以將該類型作為一種數(shù)據(jù)類型使用,使用的方式與普通數(shù)據(jù)類型一樣没佑。
package main
import "fmt"
/* 這里是結(jié)構(gòu)體的定義毕贼,定義部分包含3部分
* type關(guān)鍵字, 名稱 struct關(guān)鍵字蛤奢。 之后
* 是結(jié)構(gòu)體定義的主體鬼癣,里面具體的成員定義。
* 成員定義有名稱和類型構(gòu)成啤贩。*/
type Student struct {
name string
age uint8
score uint8
}
func main() {
/* 這里是結(jié)構(gòu)體類型的定義待秃,與普通變量無(wú)疑 */
var zhang Student
/* 還可以在定義的時(shí)候進(jìn)行初始化 */
var wang = Student{"ericwang", 17, 99}
/* 成員訪問, 通過 變量名.成員 進(jìn)行訪問痹屹。 */
zhang.name = "sunnyzhang"
zhang.age = 18
zhang.score = 98
/* 獲取成員的值 */
fmt.Println( zhang.age, wang.age )
}
接口
在面向?qū)ο缶幊讨姓掠簦梢赃@么說:“接口定義了對(duì)象的行為”, 那么具體的實(shí)現(xiàn)行為就取決于對(duì)象了志衍。在Go中暖庄,接口是一組方法簽名。當(dāng)一個(gè)類型為接口中的所有方法提供定義時(shí)楼肪,它被稱為實(shí)現(xiàn)該接口培廓。它與oop非常相似。接口指定類型應(yīng)具有的方法春叫,類型決定如何實(shí)現(xiàn)這些方法肩钠。下面我們看一個(gè)具體的實(shí)例:
package main
import "fmt"
/* 這里是接口的定義俘侠,定義部分包含3部分
* type關(guān)鍵字, 名稱 interface關(guān)鍵字蔬将。 之后
* 是接口定義的主體爷速,里面包含該接口具有的
* 方法定義 */
type Student interface {
get_name() string
get_age() uint8
}
/* 這里定義的是結(jié)構(gòu)體的數(shù)據(jù)類型
* */
type StudentS struct {
name string
age uint32
}
/* 下面是接口的具體實(shí)現(xiàn),對(duì)接口的get_name方法
* 進(jìn)行了實(shí)現(xiàn)霞怀,并且綁定到了StudentS類型上惫东。
* 這種定義方式與C++和Java的非常不同,這里沒有
* this或者self毙石,而是有開發(fā)者自己定義廉沮。*/
func (student StudentS) get_name () string{
return student.name
}
func main() {
var student = StudentS{"sunnyzhang", 18}
/* 獲取成員的值 */
fmt.Println( student.get_name() )
}
好了,今天我們對(duì)基本的符合數(shù)據(jù)類型進(jìn)行了基本的介紹徐矩,大家也基本可以依葫蘆畫瓢了滞时。后面我們?cè)俳Y(jié)合實(shí)例進(jìn)行深入的介紹。
截止到目前滤灯,我們通過4篇文章對(duì)Go語(yǔ)言的基本語(yǔ)法有了一個(gè)基本的認(rèn)識(shí)坪稽,后面我們將進(jìn)入正題,開發(fā)我們的Web服務(wù)程序鳞骤。希望通過這些實(shí)例能夠讓大家對(duì)Go語(yǔ)言有更加深入的了解窒百。如果有任何問題,也希望大家在下面留言豫尽,作者會(huì)盡可能詳細(xì)的回復(fù)大家篙梢。