Go語言入門【三】:通過一段代碼學(xué)Go語法

寫在前面

Golang的語法足夠簡(jiǎn)單珠增,但變化很多超歌,剛接觸只需要掌握典型的用法即可,不需要知道所有的語法糖蒂教,所以代碼中并不會(huì)包含所有可能的語法形式巍举。

并發(fā)是Golang的一大主題,后續(xù)有專門的一節(jié)凝垛,并不出現(xiàn)在這一節(jié)懊悯。

還有一些『約定』:

  • 可見性。Java中有private梦皮,protect炭分,public。Golang默認(rèn)采用首字母大小寫來判斷:首字母大寫的變量剑肯、方法為public捧毛,所有范圍內(nèi)可見;首字母小寫的為private让网,本文件內(nèi)可見呀忧。
  • 簡(jiǎn)潔性。import引入的包以及定義的變量必須被使用溃睹,否則程序編譯不通過荐虐。因此,代碼var p ClassA不是一個(gè)聲明定義丸凭,而是包含了初始化,實(shí)際上內(nèi)存已經(jīng)被分配了腕铸,這一點(diǎn)很容易忽視惜犀。

下面上代碼:

//一段普通的Go語言代碼,用于go語言學(xué)習(xí),作者知米無忌于2016-11-29


//聲明包狠裹,包名和目錄的路徑一致虽界,以$GOPATH/src為根,如src/math/add.go的包為math涛菠。
// 此外莉御,如果為入口(即包含main函數(shù))則包名為main撇吞,此時(shí)可以被go build編譯為可執(zhí)行文件。
package main

//塊狀import注意:
//import必須被使用礁叔,不能import了但不用他
import (
    "fmt"
    "strconv"
    "reflect"
)

//塊狀定義變量
var (
    // int 類型包括了rune, int8, int16, int32, int64和byte, uint8, uint16, uint32, uint64牍颈。其中rune是int32的別稱,byte是uint8的別稱琅关。
    myInt int
    //float 包括了float32,float64
    myFloat float32
    myBool bool
    myString string
)

//塊狀聲明常量
const (
    constString = "hello world,世界"
)

// 全局單獨(dú)定義的變量
var globalDefinedVar interface{}

// 定義一個(gè)結(jié)構(gòu)體(也是類煮岁,因?yàn)間olang沒有類的概念),面向?qū)ο?type person struct {
    name string
    age  int
}

//person 的成員函數(shù),顯式的指定p涣易,即Java中的this指針画机,python中的函數(shù)第一個(gè)參數(shù)self
func (p *person)  introduceMyself() {
    fmt.Println("my name is " + p.name)
    fmt.Println(p.age)
}
func (p *person) shoot() {
    fmt.Println("I can shoot, so I can play football.")
}

//定義一個(gè)接口
type footballPlayer interface {
    shoot()
}

func main() {

    ////////////
    // 1.變量定義
    ////////////

    var localString string
    localString = `字符串是
    一對(duì)雙引號(hào)(表示單行)或反引號(hào)(表示多行)
    括起來定義`


    ////////////
    // 2.rune, byte數(shù)組,string的關(guān)系
    ////////////

    myRune := '我'
    fmt.Println(myRune)
    //rune轉(zhuǎn)為string
    myRuneString:= string(myRune)
    fmt.Println(myRuneString)
    //rune轉(zhuǎn)為字節(jié)數(shù)組
    bytes:=[]byte(myRuneString)
    fmt.Println(bytes)


    // interface{} 類型可賦值任意類型,類似Java的Object類型
    globalDefinedVar = localString

    newVar := ":=是聲明并初始化的簡(jiǎn)寫形式新症,由系統(tǒng)自動(dòng)推測(cè)類型"
    fmt.Println(newVar)

    ////////////
    // 3.數(shù)組定義并初始化
    ////////////

    myArray := [3]int{1, 2, 3}
    //數(shù)組定義,默認(rèn)初始化為了5個(gè)0
    var myArray2 [5]int
    fmt.Println(myArray2)
    fmt.Println(myArray)

    ////////////
    // 4.slice
    ////////////

    mySlice := []int{1, 2, 3, 4}
    //從數(shù)組創(chuàng)建slice步氏,注意1:的使用方式,從第一個(gè)元素取到末尾徒爹,還可以[1:4]從第一個(gè)取到第四個(gè)(不包含)荚醒。來自于python(作者注)
    mySlice2 := myArray[1:]
    mySlice=append(mySlice,5,6,7)

    ////////////
    // 5.if,else塊沒什么特殊,myBool未定義默認(rèn)為false,執(zhí)行else
    ////////////

    if myBool {
        fmt.Println("if")
    } else {
        fmt.Println("else")
    }

    ////////////
    // 6.for 循環(huán)
    ////////////
    for index, value := range mySlice {
        fmt.Printf("index: %d,value:%d \n", index, value)
    }
    for (true) {
        fmt.Println("還可以這樣使用瀑焦,相當(dāng)于while(true)")
        //避免無限循環(huán)腌且,直接break掉
        break
    }

    ////////////
    // 7.map創(chuàng)建,刪除和使用榛瓮,range關(guān)鍵字使用
    ////////////

    myMap := make(map[string]int)
    myMap["a"] = 1
    myMap["b"] = 2
    myMap["c"] = 3
    delete(myMap, "a")
    for key, value := range myMap {
        fmt.Printf("key: %s,value:%d", key, value)
    }

    ////////////
    // 8.面向?qū)ο?    ////////////

    // 對(duì)象初始化的兩種方式铺董,第一種返回的是指針,第二種返回的是對(duì)象禀晓。
    //注意new永遠(yuǎn)返回指針
    jack := new(person)
    jack.name = "jack"
    jack.age = 17
    amy := person{"amy", 16}
    jack.introduceMyself()
    //證明是指針
    (*jack).introduceMyself()
    amy.introduceMyself()
    //拋異常 invalid indirect of amy (type person)
    //(*amy).introduceMyself()
    fmt.Println(reflect.TypeOf(jack))
    fmt.Println(reflect.TypeOf(amy))



    ////////////
    // 9.接口使用
    ////////////

    //接口的賦值精续,可以看出來不需要jack的person類實(shí)現(xiàn)該接口就可以實(shí)現(xiàn),只需要擁有接口所需的功能即可粹懒。
    var footballPlayer1 = jack
    footballPlayer1.shoot()

    //函數(shù)調(diào)用重付,可以多返回值
    myString = "golang is awesome"
    myRet1, myRet2 := receive2Return2(myString, myInt)
    fmt.Println(myRet1, myRet2)



    ////////////
    // 10.異常處理
    ////////////

    //錯(cuò)誤處理,調(diào)用了一個(gè)拋異常的方法
    malfunction()
    //兩個(gè)知識(shí)點(diǎn):
    //1.recover會(huì)收集到由調(diào)用棧中的panic拋出的異常信息
    //2.defer的執(zhí)行時(shí)機(jī)是執(zhí)行defer的函數(shù)退出的時(shí)候凫乖,類似于java中的finally确垫,但是不需要把一大段代碼用大括號(hào)包圍,這樣代碼層次減少了帽芽。
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()

    //每個(gè)定義過的變量和常量都要被使用删掀,不允許垃圾存在,這里做個(gè)打印
    fmt.Println(myBool, myFloat,constString,mySlice2)

}

func receive2Return2(param1 string, param2 int) (ret1 string, ret2 int) {
    fmt.Println("param1:" + param1)
    fmt.Println("param2:" + strconv.Itoa(param2))
    return "returned " + param1, param2 + 1
}

func malfunction() {
    panic("some thing went wrong!")
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末导街,一起剝皮案震驚了整個(gè)濱河市披泪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搬瑰,老刑警劉巖款票,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件控硼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡艾少,警方通過查閱死者的電腦和手機(jī)卡乾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姆钉,“玉大人说订,你說我怎么就攤上這事〕逼浚” “怎么了陶冷?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)毯辅。 經(jīng)常有香客問我埂伦,道長(zhǎng),這世上最難降的妖魔是什么思恐? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任沾谜,我火速辦了婚禮,結(jié)果婚禮上胀莹,老公的妹妹穿的比我還像新娘基跑。我一直安慰自己,他們只是感情好描焰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布媳否。 她就那樣靜靜地躺著,像睡著了一般荆秦。 火紅的嫁衣襯著肌膚如雪篱竭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天步绸,我揣著相機(jī)與錄音掺逼,去河邊找鬼。 笑死瓤介,一個(gè)胖子當(dāng)著我的面吹牛吕喘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刑桑,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼兽泄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了漾月?” 一聲冷哼從身側(cè)響起突琳,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤猛计,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拟糕,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年卒蘸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了校辩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烛芬,死狀恐怖隧期,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赘娄,我是刑警寧澤仆潮,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站遣臼,受9級(jí)特大地震影響性置,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揍堰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一鹏浅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屏歹,春花似錦隐砸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至械馆,卻和暖如春胖眷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霹崎。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工珊搀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尾菇。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓境析,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親派诬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劳淆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)默赂,斷路器沛鸵,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法曲掰,繼承相關(guān)的語法疾捍,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • 上個(gè)星期幾乎每天都吃很多栏妖,上一頓還沒消化完就開始吃下一頓了乱豆,每次都有負(fù)罪感,想著下一頓一定少吃點(diǎn)吊趾,但不一會(huì)大腦的另...
    木刻茉莉閱讀 194評(píng)論 0 0
  • 圖片發(fā)自簡(jiǎn)書App 在歐洲人們信仰上帝宛裕,中國(guó)人有一種儒生情懷,日本人則信奉武士道精神论泛。不同的精神信仰代表者不同的價(jià)...
    幽九天獨(dú)步閱讀 524評(píng)論 6 3