體驗(yàn)golang語(yǔ)言的風(fēng)騷編程

聲明:本文為終端研發(fā)部原創(chuàng)痒玩,未經(jīng)允許不得轉(zhuǎn)載

最近想搞搞后臺(tái)開發(fā)淳附,話說注意力就轉(zhuǎn)移到了公司用的golang。用Go做微服務(wù)比較方便蠢古,或許是因?yàn)間olang強(qiáng)悍的語(yǔ)法吧奴曙,看到go的語(yǔ)法,自己已被深深的吸引草讶。

來我們一起感受下Go的風(fēng)騷式的代碼風(fēng)格洽糟。

1、魔鬼式變量聲明

2堕战、數(shù)組的聲明

array就是數(shù)組坤溃,它的定義方式如下:

var arr [n]type

在[n]type中,n表示數(shù)組的長(zhǎng)度嘱丢,type表示存儲(chǔ)元素的類型薪介。對(duì)數(shù)組的操作和其它語(yǔ)言類似,都是通過[]來進(jìn)行 讀取或賦值:

var arr [10]int  // 聲明了一個(gè)int類型的數(shù)組 
arr[0] = 42      // 數(shù)組下標(biāo)是從0開始的 
arr[1] = 13      // 賦值操作 
fmt.Printf("The first element is %d\n", arr[0])  // 獲取數(shù)據(jù)越驻,返回42 
fmt.Printf("The last element is %d\n", arr[9]) //返回未賦值的最后一個(gè)元素汁政,默認(rèn)返回0 

由于長(zhǎng)度也是數(shù)組類型的一部分,因此[3]int與[4]int是不同的類型缀旁,數(shù)組也就不能改變長(zhǎng)度记劈。數(shù)組之間的賦值是 值的賦值,即當(dāng)把一個(gè)數(shù)組作為參數(shù)傳入函數(shù)的時(shí)候并巍,傳入的其實(shí)是該數(shù)組的副本抠蚣,而不是它的指針。如果要使用指 針履澳,那么就需要用到后面介紹的slice類型了嘶窄。

數(shù)組可以使用另一種:=來聲明

a := [3]int{1, 2, 3} // 聲明了一個(gè)長(zhǎng)度為3的int數(shù)組 
b := [10]int{1, 2, 3} // 聲明了一個(gè)長(zhǎng)度為10的int數(shù)組怀跛,其中前三個(gè)元素初始化為1、2柄冲、3吻谋,其它默認(rèn)為0 
c := [...]int{4, 5, 6} // 可以省略長(zhǎng)度而采用`...`的方式,Go會(huì)自動(dòng)根據(jù)元素個(gè)數(shù)來計(jì)算長(zhǎng)度

3现横、 go語(yǔ)言強(qiáng)大的slice操作

golang 中的 slice 非常強(qiáng)大漓拾,讓數(shù)組操作非常方便高效。在開發(fā)中不定長(zhǎng)度表示的數(shù)組全部都是 slice 戒祠。但是很多同學(xué)對(duì) slice 的模糊認(rèn)識(shí)骇两,造成認(rèn)為golang中的數(shù)組是引用類型,結(jié)果就是在實(shí)際開發(fā)中碰到很多坑姜盈,以至于出現(xiàn)一些莫名奇妙的問題低千,數(shù)組中的數(shù)據(jù)丟失了
slice 的數(shù)據(jù)結(jié)構(gòu),它很簡(jiǎn)單馏颂,一個(gè)指向真實(shí) array 地址的指針 ptr 示血,slice 的長(zhǎng)度 len 和容量 cap

其中 len 和 cap 就是我們?cè)谡{(diào)用 len(slice) 和 cap(slice) 返回的值救拉。

我們來按照 slice 的數(shù)據(jù)結(jié)構(gòu)定義來解析出 ptr, len, cap

// 按照上圖定義的數(shù)據(jù)結(jié)構(gòu)

type Slice struct {
    ptr   unsafe.Pointer        // Array pointer
    len   int               // slice length
    cap     int               // slice capacity

示例代碼

4难审、map的聲明

注意由于go語(yǔ)言是一個(gè)強(qiáng)類型的語(yǔ)言,因此hashmap也是有類型的亿絮,具體體現(xiàn)在key和value都必須指定類型告喊,比如聲明一個(gè)key為string,value也是string的map派昧,
需要這樣做

go語(yǔ)言中的枚舉


5黔姜、for循環(huán)的遍歷

func formapTest() {
    var arrayi= [...] int{1, 2, 3, 4, 5, 6, 7, 78, 9, 10}
    for index, c := range arrayi {
        fmt.Printf("array[%d] = %d", index, c)
    }

    str := "go語(yǔ)言的學(xué)習(xí)和啪啪"
    for i, ch := range str {
        fmt.Println(i, ch) //ch的類型為rune unicode編碼
    }
    //輸出為:28907  (Unicode編碼時(shí),兩個(gè)字節(jié)代表一個(gè)字符)

    n := len(str)
    for i := 0; i < n; i++ {
        ch := str[i] // 依據(jù)下標(biāo)取字符串中的字符斗锭,類型為byte
        fmt.Println(i, ch)
        //輸出為utf-8編碼地淀,一個(gè)漢字字符占三個(gè)字節(jié)
    }

    array := []rune(str)
    n = len(array)
    for i := 0; i < n; i++ {
        ch := array[i]     // 依據(jù)下標(biāo)取字符串中的字符,類型為byte
         fmt.Println(i, ch) //unicode 編碼轉(zhuǎn)十進(jìn)制輸出
        //golang中字符類型的實(shí)際數(shù)據(jù)類型為uint32,以for循環(huán)遍歷的方式輸出結(jié)果都是Unicode編碼的
    }
    //var str string= "yyh岖是,hello帮毁,卡卡論壇,好厲害哦"
    //fmt.Print(str)
    fmt.Print("\n================================\n")
    for i , ch :=  range str{
        //fmt.Printf("(%d, %c)",i,ch)
        fmt.Printf("(%d, %x)",i,ch)
    }

    fmt.Print(utf8.RuneCountInString(str))
    fmt.Print("================================\n")
    bytes := [] byte(str)

    //for len(bytes) > 0 {
        r, size := utf8.DecodeRune(bytes)
        fmt.Printf("%c  %d",r,size)
    //}
    fmt.Println()
    fmt.Println()
    fmt.Println()
    for i,c := range bytes{

        r,_ :=utf8.DecodeRune(bytes)
        fmt.Printf("%d  %c %x \n",i,r,c)
    }
    for i ,ch := range []rune(str){
        fmt.Printf("%d: %c  ",i,ch)
    }

    str2 := "123 我按時(shí) 的發(fā)ad fg票 是否 adfg 發(fā) 發(fā)生a f發(fā) 的sj df"
    sps   := strings.Split(str2," ")
    sps = strings.Fields(str2)
    var isContact  =  strings.Contains(str2,"你們")
    fmt.Println(sps)
    fmt.Println(isContact)
}

6豺撑、 golang中的結(jié)構(gòu)體和繼承

7烈疚、 golang中的接口

8、 golang中的空interface

類似于java中的object聪轿,空interface(interface{})不包含任何的method爷肝,正因?yàn)槿绱耍械念愋投紝?shí)現(xiàn)了空interface〉婆祝空interface對(duì)于
描述起不到任何的作用(因?yàn)樗话魏蔚膍ethod)金赦,但是空interface在我們需要存儲(chǔ)任意類型的數(shù)值的時(shí)候相當(dāng)有用,因?yàn)樗梢源鎯?chǔ)任意類型的數(shù)值对嚼。它有點(diǎn)類似于C語(yǔ)言的void*類型夹抗。

一個(gè)函數(shù)把interface{}作為參數(shù),那么他可以接受任意類型的值作為參數(shù)纵竖,如果一個(gè)函數(shù)返回interface{},那么也
就可以返回任意類型的值漠烧。是不是很有用啊靡砌!

9已脓、結(jié)構(gòu)體中可以定義字段,但接口不行

structs與interfaces不能具有相同的API通殃,因?yàn)閕nterfaces無法定義字段度液。這個(gè)問題并算很大,因?yàn)榭梢栽诮涌谥卸xgetter和setter方法邓了,雖然這有點(diǎn)混亂恨诱。 eg:

10媳瞪、Public和Private命名

Golang將Python的public和private方法命名方案做了進(jìn)一步發(fā)展骗炉。當(dāng)我最初發(fā)現(xiàn)以大寫字母開頭的函數(shù)、結(jié)構(gòu)體是public蛇受,而小寫開頭的則是private的時(shí)候句葵, 感覺不可思議,但我很享受這種語(yǔ)法兢仰。

type PublicStructName struct {} //public 外部能調(diào)用
type privateStructName struct {} // 私有 結(jié)構(gòu)體乍丈,僅內(nèi)部函數(shù)能調(diào)用

最后

今天就先到這里,golang語(yǔ)法很多把将,這里只是其中的冰山一角轻专。如果大家想學(xué)習(xí)golang,我這里推薦:https://github.com/Unknwon/the-way-to-go_ZH_CN

閱讀更多

31道Android面試題 察蹲,牢固你的基礎(chǔ)请垛!

做后臺(tái)是選擇Java 、Go 洽议,還是 PHP?

AndroidUtils:Android開發(fā)不得不收藏的Utils

美團(tuán)面試題:Java-線程池 ThreadPool 專題詳解

相信自己宗收,沒有做不到的,只有想不到的

在這里獲得的不僅僅是技術(shù)亚兄!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末混稽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匈勋,老刑警劉巖礼旅,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洽洁,居然都是意外死亡各淀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門诡挂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碎浇,“玉大人,你說我怎么就攤上這事璃俗∨В” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵城豁,是天一觀的道長(zhǎng)苟穆。 經(jīng)常有香客問我,道長(zhǎng)唱星,這世上最難降的妖魔是什么雳旅? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮间聊,結(jié)果婚禮上攒盈,老公的妹妹穿的比我還像新娘。我一直安慰自己哎榴,他們只是感情好型豁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尚蝌,像睡著了一般迎变。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上飘言,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天衣形,我揣著相機(jī)與錄音,去河邊找鬼姿鸿。 笑死谆吴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的般妙。 我是一名探鬼主播纪铺,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碟渺!你這毒婦竟也來了鲜锚?” 一聲冷哼從身側(cè)響起突诬,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芜繁,沒想到半個(gè)月后旺隙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骏令,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年蔬捷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榔袋。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡周拐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凰兑,到底是詐尸還是另有隱情妥粟,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布吏够,位于F島的核電站勾给,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏锅知。R本人自食惡果不足惜播急,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望售睹。 院中可真熱鬧桩警,春花似錦、人聲如沸侣姆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捺宗。三九已至,卻和暖如春川蒙,著一層夾襖步出監(jiān)牢的瞬間蚜厉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工畜眨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昼牛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓康聂,卻偏偏與公主長(zhǎng)得像贰健,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恬汁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容